#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int parent[N],sz[N];
void make(int v){
parent[v] = v;
sz[v]=1;
}
int find(int v){
if(v == parent[v]) return parent[v];
//path compression
parent[v]=find(parent[v]);
return parent[v];
}
void Union(int a, int b){
a=find(a);
b=find(b);
if(a!=b){
//union by size
if(sz[a]<sz[b])swap(a,b);
parent[b]=a;
sz[a]+=sz[b];
}
}
int main()
{
int n,m;
cin>>n>>m; //number of nodes and edges
vector<pair<int,pair<int,int> > >edges;// weight and nodes of edges
for( int i=0;i<m;i++){
int u,v,wt;
cin>>u>>v>>wt;
edges.push_back({wt, {u,v}});
}
sort(edges.begin(),edges.end());
for(int i=0;i<=n;i++)make(i);
int total_cost=0;
for(auto &edge:edges){
int wt=edge.first;
int u=edge.second.first; //u and v are nodes
int v=edge.second.second;// u and v are nodes
if(find(u)==find(v)) continue; //find parents of u and v and if they are same then continue the loop
Union(u,v);// union of u and v
total_cost+=wt; //add weight of edge to total cost
cout<<u<<" "<<v<<endl;
}
cout<<total_cost<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE49MWU1KzEwOwoKaW50IHBhcmVudFtOXSxzeltOXTsKCnZvaWQgbWFrZShpbnQgdil7CnBhcmVudFt2XSA9IHY7CnN6W3ZdPTE7Cn0KCmludCBmaW5kKGludCB2KXsKaWYodiA9PSBwYXJlbnRbdl0pIHJldHVybiBwYXJlbnRbdl07Ci8vcGF0aCBjb21wcmVzc2lvbgogcGFyZW50W3ZdPWZpbmQocGFyZW50W3ZdKTsKcmV0dXJuIHBhcmVudFt2XTsKCn0KCnZvaWQgVW5pb24oaW50IGEsIGludCBiKXsKICAgIGE9ZmluZChhKTsKICAgIGI9ZmluZChiKTsKICAgIGlmKGEhPWIpewogICAgICAgIC8vdW5pb24gYnkgc2l6ZQogICAgICAgIGlmKHN6W2FdPHN6W2JdKXN3YXAoYSxiKTsKICAgICAgICBwYXJlbnRbYl09YTsKICAgICAgICBzelthXSs9c3pbYl07Cn0KfQoKCgppbnQgbWFpbigpCnsKICAgIGludCBuLG07CiAgICBjaW4+Pm4+Pm07IC8vbnVtYmVyIG9mIG5vZGVzIGFuZCBlZGdlcwogICAgdmVjdG9yPHBhaXI8aW50LHBhaXI8aW50LGludD4gPiA+ZWRnZXM7Ly8gd2VpZ2h0IGFuZCBub2RlcyBvZiBlZGdlcwogICAgZm9yKCBpbnQgaT0wO2k8bTtpKyspewogICAgIGludCB1LHYsd3Q7CiAgICAgY2luPj51Pj52Pj53dDsKICAgICBlZGdlcy5wdXNoX2JhY2soe3d0LCB7dSx2fX0pOwogICAgfQogICAgc29ydChlZGdlcy5iZWdpbigpLGVkZ2VzLmVuZCgpKTsKICAgIGZvcihpbnQgaT0wO2k8PW47aSsrKW1ha2UoaSk7CiAgCiAgICBpbnQgdG90YWxfY29zdD0wOwogICAgZm9yKGF1dG8gJmVkZ2U6ZWRnZXMpewogICAgICAgIGludCB3dD1lZGdlLmZpcnN0OwogICAgICAgIGludCB1PWVkZ2Uuc2Vjb25kLmZpcnN0OyAvL3UgYW5kIHYgYXJlIG5vZGVzCiAgICAgICAgaW50IHY9ZWRnZS5zZWNvbmQuc2Vjb25kOy8vIHUgYW5kIHYgYXJlIG5vZGVzCiAgICAgICBpZihmaW5kKHUpPT1maW5kKHYpKSBjb250aW51ZTsgLy9maW5kIHBhcmVudHMgb2YgdSBhbmQgdiBhbmQgaWYgdGhleSBhcmUgc2FtZSB0aGVuIGNvbnRpbnVlIHRoZSBsb29wCiAgICAgICBVbmlvbih1LHYpOy8vIHVuaW9uIG9mIHUgYW5kIHYgCiAgICAgICB0b3RhbF9jb3N0Kz13dDsgLy9hZGQgd2VpZ2h0IG9mIGVkZ2UgdG8gdG90YWwgY29zdAogICAgICAgY291dDw8dTw8IiAiPDx2PDxlbmRsOwogICAgfQogICAgY291dDw8dG90YWxfY29zdDw8ZW5kbDsKCgp9Cg==