#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
****************************************************************/