#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct road{
    int v1, v2, cost;
};

bool my_greater(const road &a, const road &b){
    return a.cost < b.cost;
};

int find_parent(const vector<int> &vec, const int &a){
    if(vec[a] == a) return a;
    else return find_parent(vec, vec[a]);
}

int connact(vector<int> &vec, const int &a, const int &b){
    int ap = find_parent(vec, a);
    int bp = find_parent(vec, b);
    if(ap != bp){
        vec[bp] = ap;
        return 1;
    } 
    else{
        return 0;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M;
    while(cin >> N >> M){
        if(N == 0) break;
        vector<int> parent(M + 1, 0);
        for(int i = 1; i <= M; i++) parent[i] = i;
        vector<road> trans(N);
        int sum_road = 0;
        int sum_cost = 0;
        for(int i = 0; i < N; i++){
            cin >> trans[i].v1 >> trans[i].v2 >> trans[i].cost;
        }
        sort(trans.begin(), trans.end(), my_greater);
        for(int i = 0; i < N; i++){
            int x = connact(parent, trans[i].v1, trans[i].v2);
            if(x == 1){
                sum_road++;
                sum_cost += trans[i].cost;
            }
        }
        if(sum_road == M - 1) cout << sum_cost << "\n";
        else cout << "?" << "\n";
    }
    return 0;
}