#include <stdio.h>
typedef struct Road
{
int a,b;
int w;
}Road;
int n,m;
Road road[101];
int set[101];
int root(int a)
{
while(a!=set[a])
a=set[a];
return a;
}
void sort(void)
{
int i,j;
Road t;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(road[i].w>=road[j].w)
{
t = road[i];
road[i] = road [j];
road[j] = t;
}
}
}
}
int main(void)
{
int i,j;
int a,b,w;
int s=0;
while(scanf("%d%d",&n,&m)==2)
{
if(n==0)break;
for(i=1;i<=m;i++)
set[i]=i;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&w);
road[i].a = a;
road[i].b = b;
road[i].w = w;
}
sort();
s=0;
for(i=1;i<=n;i++)
{
a=road[i].a;
b=road[i].b;
w=road[i].w;
a=root(a);
b=root(b);
if(a!=b)
{
set[b]=a;
s+=w;
}
}
j=0;
for(i=1;i<=m;i++)
{
if(set[i]==i)
j++;
}
if(j==1)
printf("%d\n",s);
else
printf("?\n");
}
return 0;
}
/**************************************************************
Problem: 2204
User: admin
Language: C
Result: Accepted
Time:14 ms
Memory:1148 kb
****************************************************************/