1 //裸的kruskal,如果不会的多看下并查集吧,不多说了
2 #include<stdio.h>
3 #include<string.h>
4 #include<algorithm>
5 using namespace std;
6 #define maxn 100
7 int fa[maxn],rank[maxn];
8 struct node
9 {
10 int st,nd,ln;
11 }edge[maxn*maxn];
12 int cmp(node a,node b)
13 {
14 return a.ln<b.ln;
15 }
16 void init()
17 {
18 int i;
19 for(i=0;i<maxn;i++)
20 {
21 rank[i]=1;
22 fa[i]=i;
23 }
24 }
25 int findfather(int x)
26 {
27 if(x!=fa[x])
28 fa[x]=findfather(fa[x]);
29 return fa[x];
30 }
31 void kruskal(int n,int m)
32 {
33 int ans,num,i,x,y;
34 ans=num=0;
35 sort(edge+1,edge+1+n,cmp);
36 for(i=1;i<=n;i++)
37 {
38 x=findfather(edge[i].st);
39 y=findfather(edge[i].nd);
40 if(x!=y)
41 {
42 ans+=edge[i].ln;
43 if(rank[x]>rank[y])
44 {
45 fa[y]=x;
46 rank[x]+=rank[y];
47 }
48 else
49 {
50 fa[x]=y;
51 rank[y]+=rank[x];
52 }
53 if(++num==m-1)
54 break;
55 }
56 }
57 if(num==m-1)
58 printf("%d\n",ans);
59 else
60 printf("?\n");
61 }
62 int main()
63 {
64 int n,m,i;
65 while(scanf("%d",&n)!=EOF)
66 {
67 init();
68 scanf("%d",&m);
69 if(n==0)
70 break;
71 for(i=1;i<=n;i++)
72 {
73 scanf("%d%d%d",&edge[i].st,&edge[i].nd,&edge[i].ln);
74 }
75 if(n<m-1)
76 {
77 printf("?\n");
78 continue;
79 }
80 kruskal(n,m);
81 }
82 return 0;
83 }