#include<bits/stdc++.h>
struct shu{
int a,b,v;
}c[10000];
bool cmp(shu x,shu y){
return x.v<y.v;
}
int pre[10000];
int find(int x){
if(x!=pre[x])
return find(pre[x]);
else return x;
}
join(int x,int y){
int fx,fy;
fx=find(x);fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
using namespace std;
int main(){
int n,m,i,s=0;
while(scanf("%d%d",&n,&m)&&n!=0){
s=0;
for(i=1;i<=10000;i++)
pre[i]=i;
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d%d%d",&c[i].a,&c[i].b,&c[i].v);
}
sort(c+1,c+n+1,cmp);
for(i=1;i<=n;i++){
if(find(c[i].a)!=find(c[i].b)){
s=s+c[i].v;
join(c[i].a,c[i].b);
}
}
int flag=1;
for(i=2;i<=m;i++){
if(find(1)!=find(i))
flag=0;
}
if(flag)
printf("%d\n",s);
else
printf("?\n");
}
return 0;
}