#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++){
char u,v;
int wt;
cin>>u>>v>>wt;
edges.push_back({wt, {u-'A',v-'A'}});
}
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<<(char)(u+'A')<<" "<<(char)(v+'A')<<endl;
}
cout<<total_cost<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE49MWU1KzEwOwoKaW50IHBhcmVudFtOXSxzeltOXTsKCnZvaWQgbWFrZShpbnQgdil7CnBhcmVudFt2XSA9IHY7CnN6W3ZdPTE7Cn0KCmludCBmaW5kKGludCB2KXsKaWYodiA9PSBwYXJlbnRbdl0pIHJldHVybiBwYXJlbnRbdl07Ci8vcGF0aCBjb21wcmVzc2lvbgogcGFyZW50W3ZdPWZpbmQocGFyZW50W3ZdKTsKcmV0dXJuIHBhcmVudFt2XTsKCn0KCnZvaWQgVW5pb24oaW50IGEsIGludCBiKXsKICAgIGE9ZmluZChhKTsKICAgIGI9ZmluZChiKTsKICAgIGlmKGEhPWIpewogICAgICAgIC8vdW5pb24gYnkgc2l6ZQogICAgICAgIGlmKHN6W2FdPHN6W2JdKXN3YXAoYSxiKTsKICAgICAgICBwYXJlbnRbYl09YTsKICAgICAgICBzelthXSs9c3pbYl07Cn0KfQoKCgppbnQgbWFpbigpCnsKICAgIGludCBuLG07CiAgICBjaW4+Pm4+Pm07IC8vbnVtYmVyIG9mIG5vZGVzIGFuZCBlZGdlcwogICAgdmVjdG9yPHBhaXI8aW50LHBhaXI8aW50LGludD4gPiA+ZWRnZXM7Ly8gd2VpZ2h0IGFuZCBub2RlcyBvZiBlZGdlcwogICAgZm9yKCBpbnQgaT0wO2k8bTtpKyspewogICAgIGNoYXIgdSx2OwogICAgIGludCB3dDsKICAgICBjaW4+PnU+PnY+Pnd0OwogICAgIGVkZ2VzLnB1c2hfYmFjayh7d3QsIHt1LSdBJyx2LSdBJ319KTsKICAgIH0KICAgIHNvcnQoZWRnZXMuYmVnaW4oKSxlZGdlcy5lbmQoKSk7CiAgICBmb3IoaW50IGk9MDtpPD1uO2krKyltYWtlKGkpOwogIAogICAgaW50IHRvdGFsX2Nvc3Q9MDsKICAgIGZvcihhdXRvICZlZGdlOmVkZ2VzKXsKICAgICAgICBpbnQgd3Q9ZWRnZS5maXJzdDsKICAgICAgICBpbnQgdT1lZGdlLnNlY29uZC5maXJzdDsgLy91IGFuZCB2IGFyZSBub2RlcwogICAgICAgIGludCB2PWVkZ2Uuc2Vjb25kLnNlY29uZDsvLyB1IGFuZCB2IGFyZSBub2RlcwogICAgICAgaWYoZmluZCh1KT09ZmluZCh2KSkgY29udGludWU7IC8vZmluZCBwYXJlbnRzIG9mIHUgYW5kIHYgYW5kIGlmIHRoZXkgYXJlIHNhbWUgdGhlbiBjb250aW51ZSB0aGUgbG9vcAogICAgICAgVW5pb24odSx2KTsvLyB1bmlvbiBvZiB1IGFuZCB2IAogICAgICAgdG90YWxfY29zdCs9d3Q7IC8vYWRkIHdlaWdodCBvZiBlZGdlIHRvIHRvdGFsIGNvc3QKICAgICAgIGNvdXQ8PChjaGFyKSh1KydBJyk8PCIgIjw8KGNoYXIpKHYrJ0EnKTw8ZW5kbDsKICAgIH0KICAgIGNvdXQ8PHRvdGFsX2Nvc3Q8PGVuZGw7Cn0K