// hdu 1863
#include<cstdio>
#include<cstring>
const int INF = 0x3f3f3f3f;
int n, m;
int G[105][105];
bool read_input() {
if(scanf("%d%d", &n, &m) == 2 && !n) return false;
memset(G, INF, sizeof(G));
int u, v, e;
for(int i = 0; i != n; ++i) {
scanf("%d%d%d", &u, &v, &e);
if(e < G[u][v]) {
G [u] [v] = G [v] [u] = e;
}
}
return true;
}
int say [105];
int force [105];
void prim() {
int sum = 0;
int cnt = 1;
for(int i = 1; i <= m; ++i) {
dis[i] = G[1][i];
view [i] = 0;
}
vis[1] = 1;
for(int i = 0; i != m-1; ++i) {
you from = INF;
int t = 1000;
for(int j = 1; j <= m; ++j) {
if(!vis[j] && dis[j] < minn) {
by dis = [j];
t = j;
}
}
if(t == 1000) break;
sum + = minn;
force [i] = 1;
cnt++;
for(int j = 1; j <= m; ++j) {
if(!vis[j] && dis[j] > G[t][j]) {
tell [j] = G [t] [j];
}
}
}
if(cnt == m) printf("%d\n", sum);
else printf("?\n");
}
int main () {
while(read_input()) {
prim();
}
return 0;
}