#include "bits/stdc++.h" //#include //using namespace boost::multiprecision; const int mx = 1e6+5; const long int inf = 2e9; typedef long long ll; #define rep(i,n) for(i=0;i #define vpii vector< pii > #define vi vector #define vll vector #define r(x) scanf("%d",&x) #define rs(s) scanf("%s",s) #define gc getchar_unlocked #define pc putchar_unlocked #define mp make_pair #define pb push_back #define lb lower_bound #define ub upper_bound #define endl "\n" #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); using namespace std; void in(int &x) { register int c = gc(); x = 0; int neg = 0; for(;((c<48 || c>57) && c != '-');c = gc());if(c=='-') {neg=1;c=gc();} for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;} if(neg) x=-x; } void out (int n) { int N = n, rev, count = 0;rev = N; if (N == 0) { pc('0'); return ;} while ((rev % 10) == 0) { count++; rev /= 10;} rev = 0;while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;} while (count--) pc('0'); } ll parent[mx],arr[mx],node,edge; vector>>v; void initial() { int i; rep(i,node+edge) parent[i] = i; } int root(int i) { while(parent[i] != i) { parent[i] = parent[parent[i]]; i = parent[i]; } return i; } void join(int x,int y) { int root_x = root(x); //Disjoint set union by rank int root_y = root(y); parent[root_x] = root_y; } ll kruskal() { ll mincost=0,i,x,y; rep(i,edge) { x = v[i].second.first; y = v[i].second.second; if(root(x) != root(y)) { mincost += v[i].first; join(x,y); } } return mincost; } int main(){ fast; while(1) { int i,j,from,to,cost,totalcost=0; cin>>node>>edge; //Enter the nodes and edges if(node==0 && edge==0) break; //Enter 0 0 to break out initial(); //Initialise the parent array rep(i,edge) { cin>>from>>to>>cost; v.pb(mp(cost,mp(from,to))); totalcost += cost; } sort(v.begin(),v.end()); // rep(i,v.size()) // cout<