#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
using namespace std ;
const int maxn = 1e2 + 10 ;
const int INF = 0x3f3f3f3f ;
bool vis[maxn] ;
int lowc[maxn] ;
int cost[maxn][maxn] ;
int prime(int n ){
int ans = 0 ;
memset( vis , false , sizeof( vis )) ;
vis[1] = true ;
for(int i = 2 ;i<=n ; i ++)
lowc[i] = cost[1][i] ;
for(int i = 2; i<=n ;i++){
int minc = INF ;
int p = -1 ;
for( int j = 1 ;j<=n ;j++)
if( !vis[j] && minc > lowc[j]){
minc = lowc[j] ;
p = j ;
}
if( minc == INF )
return -1 ;
ans += minc ;
vis[p] = true ;
for(int j = 1 ;j<=n ; j++)
if( !vis[j] && lowc[j] > cost[p][j] )
lowc[j] = cost[p][j] ;
}
return ans ;
}
void ini(){
for(int i = 0 ;i<maxn ;i++){
for(int j = 0 ;j<maxn ;j++)
cost[i][j] = INF ;
}
}
int main(){
int a , b ;
while( cin>>a>> b && a){
ini() ;
int c , d , e ;
for(int i = 0 ;i< a ;i++){
cin>>c >>d >>e ;
cost[c][d] = e ;
cost[d][c] = e ;
}
int ans = prime(b) ;
if( ans != -1)
printf("%d\n" , ans) ;
else
printf("?\n") ;
}
return 0 ;
}
#include<iostream>
#include<cstdio>
#include<sstream>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<deque>
#include<stack>
using namespace std;
#define unsigned long long ll;
const int maxn=1e4;
int f[100+5];
int F(int x){
return x==f[x]?x:f[x]=F(f[x]);
}
struct T{
int a,b,c;
}p[maxn];
bool cmp(T a,T b){
return a.c<b.c;
}
int main(){
int T,a,b,c;
while(cin>>T&&T){
for(int i=1;i<=T;i++)f[i]=i;
int N=T*(T-1)/2;
for(int i=0;i<N;i++)
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
sort(p,p+N,cmp);
int cnt=0;
for(int i=0;i<N;i++){
int x=F(p[i].a);
int y=F(p[i].b);
if(x!=y){
cnt+=p[i].c;
f[x]=y;
}
}
printf("%d\n",cnt);
}
return 0;
}