1 #include<stdio.h>
2 #include<algorithm>
3 using namespace std;
4 int fa[110] , n , m ;
5 struct edge
6 {
7 int u , v , w ;
8 }e[20000];
9
10 bool cmp (edge a , edge b)
11 {
12 return a.w < b.w ;
13 }
14
15 int find (int x)
16 {
17 return fa[x] == x ? x : find (fa[x]) ;
18 }
19
20 void kruskal ()
21 {
22 sort (e + 1 , e + m + 1 , cmp ) ;
23 int ans = 0 ;
24 int x , y ;
25 for (int i = 1 ; i <= m ; i++) {
26 x = find (e[i].u) ;
27 y = find (e[i].v) ;
28 if ( x != y ) {
29 ans += e[i].w ;
30 fa[x] = y ;
31 }
32 }
33 printf ("%d\n" , ans) ;
34 }
35
36 int main ()
37 {
38 // freopen ("a.txt" , "r" , stdin ) ;
39 int x , y ;
40 int cnt ;
41 while (~ scanf ("%d" , &m ) ) {
42 if ( m == 0 )
43 break ;
44 // printf ("n=%d, m =%d\n" , n , m ) ;
45 cnt = 0 ;
46 scanf ("%d" , &n ) ;
47 for (int i = 1 ; i <= n ; i++ )
48 fa[i] = i ;
49 for (int i = 1 ; i <= m ; i++ ) {
50 scanf ("%d%d%d" , &e[i].u , &e[i].v , &e[i].w ) ;
51 x = find (e[i].u) ;
52 y = find (e[i].v) ;
53 fa[x] = y ;
54 }
55 for (int i = 1 ; i <= n ; i++) {
56 if (fa[i] == i)
57 cnt++ ;
58 if (cnt > 1)
59 break ;
60 }
61 for (int i = 1 ; i <= n ; i++ )
62 fa[i] = i ;
63 // printf ("cnt = %d\n" ,cnt) ;
64 if (cnt > 1)
65 printf ("?\n") ;
66 else
67 kruskal () ;
68 }
69 return 0 ;
70 }