#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int N,M; bool s[110]; int ans; int flag; int map[110][110]; void prim(int u){ memset(s,0,sizeof(s)); s[u]=1; int lowcost[110]; for(int i=1;i<=M;i++) if(i!=u) { lowcost[i]=map[u][i]; } for(int i=1;i<=M;i++) { int tmp=1000000; int t=u; for(int j=1;j<=M;j++) if(!s[j]&&lowcost[j]<tmp) { tmp=lowcost[j]; t=j; } if(t==u) break; s[t]=1; ans+=lowcost[t]; for(int k=1;k<=M;k++) if(!s[k]&&lowcost[k]>map[t][k]) { lowcost[k]=map[t][k]; } } for(int i=1;i<=M;i++) if(s[i]==0) { flag=1; break; } } int main(){ while(cin>>N>>M,N){ ans=0; flag=0; memset(map,1000000,sizeof(map)); for(int i=0;i<N;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } prim(1); if(!flag) cout<<ans<<endl; else cout<<'?'<<endl; } }