#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define len 1009
#define maxint 1<<31-1
int father[len];
int height[len];
void initial_it(){
for(int i = 0;i<len;i++){
father[i] = i;
height[i] = 0;
}
}
int find(int x){
if(x!=father[x]){
father[x] = find(father[x]);
}
return father[x];
}
void bind(int a,int b){
a = find(a);
b = find(b);
if(a!=b){
if(height[a]<height[b]){
father[a] = b;
}
else if(height[b]<height[a]){
father[b] = a;
}
else{
father[b] = a;
height[a]++;
}
}
}
int set_num(int m){
int res = 0;
for(int i = 1;i<=m;i++){
if(father[i]==i){
res++;
}
}
return res;
}
typedef struct node{
int a;
int b;
int cost;
}line;
line initial_line(int a,int b,int cost){
line l;
l.a = a;
l.b = b;
l.cost = cost;
return l;
}
int l,r;
line line_list[len];
void initial_list(){
l = 0;
r = 0;
}
void push_back(line l){
line_list[r++] = l;
}
line pop_front(){
return line_list[l++];
}
int cmp(const void*s1,const void*s2){
line a1 = *(line*)s1;
line a2 = *(line*)s2;
return a1.cost-a2.cost;
}
void list_sort(){
qsort(line_list+l,r-l,sizeof(line),cmp);
}
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0){
break;
}
initial_it();
initial_list();
int a,b,cost;
for(int i = 0;i<n;i++){
scanf("%d %d %d",&a,&b,&cost);
push_back(initial_line(a,b,cost));
}
int res = 0;
while(l!=r&&set_num(m)!=1){
list_sort(n);
line l = pop_front();
int a = find(l.a);
int b = find(l.b);
int cost = l.cost;
if(a!=b){
bind(a,b);
res+=cost;
}
}
if(set_num(m)!=1){
printf("?\n");
}
else{
printf("%d\n",res);
}
}
}