1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<string>
6 #include<vector>
7 #include<set>
8 #include<map>
9 #include<queue>
10 #include<stack>
11 using namespace std;
12 const int inf=0xffffff;
13 const int MAXN=21;
14 int edges[MAXN][MAXN];
15 int lowcost[MAXN];
16 int nearvex[MAXN];
17 int n,m;
18 void prim(int u0)
19 {
20 int i,j;
21 int sum=0;
22 for(i=1;i<=n;i++)
23 {
24 lowcost[i]=edges[u0][i];
25 nearvex[i]=u0;
26 }
27 nearvex[u0]=-1;
28 for(i=1;i<n;i++) //找出n-1个顶点
29 {
30 int min=inf;
31 int v=-1;
32 for(j=1;j<=n;j++)
33 {
34 if(nearvex[j]!=-1&&lowcost[j]<min)
35 {
36 v=j;
37 min=lowcost[j];
38 }
39 }
40 if(v!=-1)
41 {
42 printf("%d %d %d\n",nearvex[v],v,lowcost[v]);
43 nearvex[v]=-1;
44 sum+=lowcost[v];
45 for(j=1;j<=n;j++)
46 {
47 if(nearvex[j]!=-1&&edges[v][j]<lowcost[j])
48 {
49 lowcost[j]=edges[v][j];
50 nearvex[j]=v;
51 }
52 }
53 }
54 }
55 }
56 int main()
57 {
58 int i,j;
59 int u,v,w;
60 scanf("%d %d",&n,&m);
61 memset(edges,0,sizeof(edges));
62 for(i=1;i<=m;i++)
63 {
64 scanf("%d%d%d",&u,&v,&w);
65 edges[u][v]=edges[v][u]=w;
66 }
67 for(i=1;i<=n;i++)
68 for(j=1;j<=n;j++)
69 {
70 if(i==j)
71 edges[i][j]=0;
72 else if(edges[i][j]==0)
73 edges[i][j]=inf;
74 }
75 prim(1);
76 return 0;
77 }