#include<stdio.h> #include<stdlib.h> struct node { int s,e,dist; }que[50000]; int pre[105]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int find(int x) { int r=x,i=x,j; while (r!=pre[r]) r=pre[r]; while(pre[i]!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } void mix(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) pre[fy]=fx; } int main() { int n,i,m,sum,cost; while(scanf("%d%d",&n,&m)&&n) { for(i=0;i<n;i++) { scanf("%d%d%d",&que[i].s,&que[i].e,&que[i].dist); } qsort(que,n,sizeof(que[0]),cmp); for(i=1;i<=m;i++) pre[i]=i; sum=0; cost=0; for(i=0;i<n;i++) { int a,b; a=find(que[i].s); b=find(que[i].e); if(a!=b) { cost+=que[i].dist; sum++; mix(a,b); } if(sum>=m-1) break; } if(sum<m-1) printf("?\n"); else printf("%d\n",cost); } return 0; }