注意事项:
1.用到结构体进行比较,在比较过程中for循环是以输入的道路条数为界限。
2.使用并查集的时候,一定要注意m,n的使用,该用m就用m,该用n就用n。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int m,n;
int pre[105];
struct sss
{
    int l;
    int r;
    int j;
}a[10005];

bool cmp (sss x,sss y)
{
    return x.j < y.j;
}

int find (int x)
{
    if(pre[x]==x) return x;
    else return pre[x]=find(pre[x]);
}

int main()
{
    while (cin >> m >> n)
    {
        if(m==0) break;
        for (int i=1;i<=n;i++)
        {
            pre[i]=i;
        }
        for (int i=1;i<=m;i++)
        {
            cin >> a[i].l >> a[i].r >> a[i].j;
        }
        sort (a+1,a+1+m,cmp);
        int sum=0;
        for (int i=1;i<=m;i++)
        {
            int ll=find(a[i].l);
            int rr=find(a[i].r);
            if(ll!=rr)
            {
                pre[ll]=rr;
                sum+=a[i].j;
            }
        }
        int num=0;
        for (int i=1;i<=n;i++)
        {
            if(pre[i]==i)num++;
        }
        if(num!=1)cout << "?" << endl;
        else cout << sum << endl;
    }
    return 0;
}