/* https://vjudge.net/problem/HDU-1863 复杂度 E*log(E) 适用于稀疏图*/# include <bits/stdc++.h>using namespace std;const int MAXN=100+100;struct Edge{ int from,to,cost; bool operator<(const Edge &a) { return cost<a.cost; }};Edge edge[MAXN];int father[MAXN];void MakeSet(int n){ for(int i=0;i<=n;i++) father[i]=i; return ;}int Find(int x){ return x==father[x]?x:Find(father[x]);}int main(){ int n,m; while(cin>>m>>n&&m)//m代表道路数,n代表村庄数 { MakeSet(n); for(int i=0;i<m;i++){ Edge &t=edge[i]; scanf("%d%d%d",&t.from,&t.to,&t.cost); } sort(edge,edge+m); int sum=0; int num=n; for(int i=0;i<m;i++)//一个个将边加进去 { Edge t=edge[i]; if(Find(t.from)==Find(t.to)) continue; father[Find(t.from)]=father[Find(t.to)]; sum+=t.cost; num--; if(num==1) break; } if(num==1) cout<<sum<<endl; else cout<<"?"<<endl; } return