#include <stdio.h> typedef struct Road { int a,b; int w; }Road; int n,m; Road road[101]; int set[101]; int root(int a) { while(a!=set[a]) a=set[a]; return a; } void sort(void) { int i,j; Road t; for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { if(road[i].w>=road[j].w) { t = road[i]; road[i] = road [j]; road[j] = t; } } } } int main(void) { int i,j; int a,b,w; int s=0; while(scanf("%d%d",&n,&m)==2) { if(n==0)break; for(i=1;i<=m;i++) set[i]=i; for(i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&w); road[i].a = a; road[i].b = b; road[i].w = w; } sort(); s=0; for(i=1;i<=n;i++) { a=road[i].a; b=road[i].b; w=road[i].w; a=root(a); b=root(b); if(a!=b) { set[b]=a; s+=w; } } j=0; for(i=1;i<=m;i++) { if(set[i]==i) j++; } if(j==1) printf("%d\n",s); else printf("?\n"); } return 0; } /************************************************************** Problem: 2204 User: admin Language: C Result: Accepted Time:14 ms Memory:1148 kb ****************************************************************/