http://acm.hdu.edu.cn/showproblem.php?pid=1863
// >File Name: 最小生成树Kruskal.cpp
// > Author: Webwei
#include<iostream>
#include<algorithm>
#define MAX 113
using namespace std;
struct edge{
int from,to;
long long cost;
}E[MAX*MAX];
int N,M;
int pre[MAX];
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
void init(){
for(int i=1;i<=N;i++) pre[i]=i;
}
int Find(int x){
return x==pre[x]?x:pre[x]=Find(pre[x]);
}
void unionset(int x,int y){
int p=Find(x);
int q=Find(y);
if(p!=q) pre[p]=q;
}
bool Same(int x,int y){
return Find(x)==Find(y);
}
long long Kruskal(){
long long res=0;
sort(E+1,E+1+M,cmp);
for(int i=1;i<=M;i++){
if(Same(E[i].from,E[i].to)) continue;
unionset(E[i].from,E[i].to);
res+=E[i].cost;
}
return res;
}
int main()
{
while(cin>>M>>N){
if(M==0) break;
init();
for(int i=1;i<=M;i++) cin>>E[i].from>>E[i].to>>E[i].cost;
long long res=Kruskal();
for(int i=1;i<=N;i++)
if(!Same(i,1))
res=-1;
if(res==-1) cout<<"?"<<endl;
else cout<<res<<endl;
}
return 0;
}
// >File Name: 最小生成树Prim.cpp
// > Author: Webwei
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int MAX=103;
struct edge{
int to;
long long cost;
edge(int tt,long long cc):to(tt),cost(cc){}
edge() {}
bool operator< (const edge &a) const{
return a.cost<cost;
}
};
priority_queue<edge> que;
vector<edge> G[MAX];
bool vis[MAX];
int N,M;
long long prim(){
long long res = 0;
vis[1]=1;
for(int i=0;i<G[1].size();i++) que.push(G[1][i]);
while(que.size()){
edge e=que.top();
que.pop();
if(vis[e.to]) continue;
vis[e.to]=1;
res+=e.cost;
for(int i=0;i<G[e.to].size();i++) que.push(G[e.to][i]);
}
return res;
}
int main()
{
while( cin>> M >> N ){
if (M==0) break;
for (int i=0;i<=N;i++) G[i].clear();
while (que.size()) que.pop();
memset(vis,0,sizeof(vis));
for (int i=1;i<=M;i++){
int u,v;
long long cost;
cin>> u >> v >> cost ;
G[u].push_back(edge(v,cost));
G[v].push_back(edge(u,cost));
}
long long res = prim();
for(int i = 1;i <=N; i++) if(!vis[i]) res = -1;
if (res == -1) cout<<"?"<<endl;
else cout<< res <<endl;
}
return 0;
}