#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;
}