#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h> #include <malloc.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<math.h> using namespace std; #define M 110 #define inf 999999999 int mat[M][M]; int prim(int n,int sta) { int i,j,dis[M],mark[M],sum=0; for(i=0;i<n;i++) { dis[i]=mat[sta][i]; mark[i]=0; } mark[sta]=1; for(i=1;i<n;i++) { int minn=inf,flag=-1; for(j=0;j<n;j++) { if(dis[j]<minn&&mark[j]==0) { minn=dis[j]; flag=j; } } if(flag==-1) return -1; else { sum+=dis[flag]; mark[flag]=1; for(j=0;j<n;j++) { if(dis[j]>mat[flag][j]) dis[j]=mat[flag][j]; } } } return sum; } int main() { int i,j,n,m,a,b,c,ans; while(scanf("%d%d",&m,&n)!=EOF)//题目中 N->m ,M->n { if(m==0)break; for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=inf; for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); mat[a-1][b-1]=mat[b-1][a-1]=c; } ans=prim(n,0); if(ans<0) printf("?\n"); else printf("%d\n",ans); } return 0; }