//prim算法
#include<iostream>
#include<string.h>
using namespace std;
#define data 1000000000
int graph[210][210],n,m,num,lowcost[210],vis[210];
int prim(int s)
{
int mindata,sum=0,i,j,u;
num=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=m;i++)
{
lowcost[i]=graph[s][i];
}
lowcost[s]=0;
vis[s]=1;
for(i=1;i<m;++i)
{
mindata=data;
for(j=1;j<=m;++j)
{
if(!vis[j]&&lowcost[j]<mindata)
{
u=j;
mindata=lowcost[j];
}
}
if(mindata==data)break;
vis[u]=1;
sum+=lowcost[u];
num++;
for(j=1;j<=m;++j)
{
if(lowcost[j]>graph[u][j])
lowcost[j]=graph[u][j];
}
}
return sum;
}
int main()
{
int i,j,pa,pb,cost;
while(cin >> n >> m&&n)
{
for(i=0;i<=m;i++)
for(j=0;j<=m;j++)
graph[i][j]=data;//注意初始化的时候应该从0开始,否则prim函数里面会报错
for(i=1;i<=n;i++)
{
cin >> pa >> pb >> cost;
graph[pa][pb]=graph[pb][pa]=cost;
}
int x=prim(1);
if(num!=m-1) cout << '?' << endl;
else cout << x << endl;
}
return 0;
}