#include <iostream> #include <cstring> using namespace std; const int N = 110, INF = 0x3f3f3f3f; int n, m; int d[N]; int g[N][N]; bool st[N]; int prim(){ memset(st, 0, sizeof st); memset(d, 0x3f, sizeof d); d[1] = 0; int res = 0; for(int i = 0; i < n; i++){ int t = -1; for(int j = 1; j <= n; j ++){ if(!st[j] && (t == -1 || d[j] < d[t])) t = j; } st[t] = true; res += d[t]; if(d[t] == INF) return d[t]; for(int j = 1; j <= n; j ++){ d[j] = min(d[j], g[t][j]); } } return res; } int main(){ while(cin>>m>>n){ if(!m) break; memset(g, 0x3f, sizeof g); for(int i = 1; i <= n; i ++) g[i][i] = 0; for(int i = 0; i < m; i ++){ int x, y, z; cin>>x>>y>>z; g[x][y] = g[y][x] = min(g[x][y], z); } int t = prim(); if(t == INF) puts("?"); else cout<<t<<endl; } return 0; }