#include<stdio.h> #include<string.h> #include<stdlib.h> int set[110],n,m; struct val { int a,b,v; }e[10000]; int find(int x) { return x==set[x] ? x : find(set[x]); } int kruskal() { int sum=0; for(int i=1;i<=n;i++) { int a=e[i].a,b=e[i].b,v=e[i].v; int x=find(a),y=find(b); if(x!=y) { set[x]=y; sum+=v; } } return sum; } int cmp(const void *a,const void *b) { return ((val *)a)->v-((val *)b)->v; } int main() { int a,b,v; while(scanf("%d%d",&n,&m),n) { for(int i=1;i<=m;i++) { set[i]=i; } for(int i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&v); e[i].a=a; e[i].b=b; e[i].v=v; } qsort(e+1,n,sizeof(e[0]),cmp); int f=0; int res=kruskal(); for(int i=1;i<=m;i++) { if(set[i]==i) f++; } if(f==1) { printf("%d\n",res); } else { printf("?\n"); } } // system("pause"); return 0; }