#include<iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#define LL long long
#define GG int
#define For(i, j, k) for(int i=j; i<=k; i++)
#define Dow(i, j, k) for(int i=j; i>=k; i--)
using namespace std;
const int N = 1011;
int n, m;
int f[N];
struct node {
int x, y, val;
}e[10000];
inline GG read() {
GG x = 0, f = 1;
char ch = getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
while(ch>='0'&&ch<='9') { x = x*10+ch-48; ch = getchar(); }
return x * f;
}
int cmp(node a, node b) {
return a.val < b.val;
}
int find(int x) {
if(f[x] == x) return x;
f[x] = find(f[x]);
return f[x];
}
int main() {
while(~scanf("%d%d", &m, &n)){
if(m == 0)
return 0;
For(i, 1, n) f[i] = i;
For(i, 1, m) {
int x, y, v;
e[i].x = read(); e[i].y = read(); e[i].val = read();
}
sort(e+1, e+m+1, cmp);
int ans = 0, tot = 0;
For(i, 1, m) {
int xx = find(e[i].x);
int yy = find(e[i].y);
if(xx != yy) f[yy] = xx, ans += e[i].val, ++tot;
if(tot==n-1) break;
}
if(tot==n-1)
printf("%d\n", ans);
else
puts("?");
}
return 0;
}