/*
分析:
刚开始没读懂题,觉得好难好难。。。
后来读懂了,晕了。。。
- -,由大到小排序,Kruskal、同时标记环的情况。
网上有详细解释,我就不废话了。
2012-08-01 14:01
*/
分析:
刚开始没读懂题,觉得好难好难。。。
后来读懂了,晕了。。。
- -,由大到小排序,Kruskal、同时标记环的情况。
网上有详细解释,我就不废话了。
2012-08-01 14:01
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
int a,b;
int len;
}eage[100011];
int set[10011];
int circle[10011];
int n,m;
int cmp(const void *a,const void *b)
{
struct A *c,*d;
c=(struct A *)a;
d=(struct A *)b;
return d->len-c->len;
}
void build(int num)
{
int i;
for(i=0;i<num;i++) set[i]=i;
}
int find(int k)
{
if(set[k]==k) return k;
set[k]=find(set[k]);
return set[k];
}
int Kruskal()
{
int i;
int f1,f2;
int ans;
ans=0;
for(i=0;i<m;i++)
{
f1=find(eage[i].a);
f2=find(eage[i].b);
if(f1==f2)
{
if(!circle[f1]) {circle[f1]=1;ans+=eage[i].len;}
continue;
}
if(circle[f1] && circle[f2]) continue;
if(circle[f1] && !circle[f2])
{
set[f2]=f1;
ans+=eage[i].len;
}
else if(!circle[f1] && circle[f2])
{
set[f1]=f2;
ans+=eage[i].len;
}
else {set[f1]=f2;ans+=eage[i].len;}
}
return ans;
}
int main()
{
int i;
while(scanf("%d%d",&n,&m),n||m)
{
build(n);
for(i=0;i<m;i++) {scanf("%d%d%d",&eage[i].a,&eage[i].b,&eage[i].len);}
qsort(eage,m,sizeof(eage[0]),cmp);
memset(circle,0,sizeof(circle));
printf("%d\n",Kruskal());
}
return 0;
}