/* 可以说是一个最大生成树的问题吧,
题意:求出一个最大的子图(子图的每个连通分量最多有一个环)
用kruskal算法求出最大生成树 不过要判断是否有环 2树合并时 :若2个子树都有环不能合并 只有一个有环可以合并 但合并后的树有环 若2个子树都没环直接合并
*/
#include<cstdio>
#include<cstring> #include<algorithm> using namespace std; int n,m; struct Edge { int u,v,d; bool operator < (const Edge &s) const { return d>s.d; } }a[100010]; int p[10010],vis[10010]; int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } int Union(int x,int y) { if(x==y) return 0; p[x] = y; } int main() { while(scanf("%d%d",&n,&m)==2) { if(!n&&!m) break; memset(vis,0,sizeof(vis)); for(int i = 0; i <= n; i++) p[i]=i; for(int i = 0; i < m; i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].d); sort(a,a+m); long long ans=0; for(int i = 0; i < m; i++) { int x = find(a[i].u); int y = find(a[i].v); if(x!=y) { if(vis[x]&&vis[y]) continue; if(vis[x]||vis[y]) vis[x]=vis[y]=1; ans+=a[i].d; Union(x,y); } else if(!vis[x]) { vis[x] = 1; ans+=a[i].d; Union(x,y); } } printf("%lld\n",ans); } return 0; }