#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int N=100010;
vector<pair<int,pair<int,int>>> cost;
vector<pair<int,int>> apm;
int n,m,x,y,cost_muchie,cost_total,tata[N], rang[N];
int find(int x)
{
while(x!=tata[x])
x=tata[x];
return x;
}
void unite(int x, int y)
{
x=find(x);
y=find(y);
if(rang[x] >= rang[y])
{
tata[y] = x;
rang[x] += rang[y];
}
else
{
tata[x] = y;
rang[y] += rang[x];
}
}
void kruskal()
{
sort(cost.begin(),cost.end());
for(auto it : cost)
if(find(it.second.first) != find(it.second.second))
{
apm.push_back(it.second);
unite(it.second.first,it.second.second);
cost_total += it.first;
}
}
int main()
{
fin>>n>>m;
for(int i=0;i<m;i++)
{
fin>>x>>y>>cost_muchie;
cost.push_back(make_pair(cost_muchie,make_pair(x,y)));
}
for(int i=0;i<n;i++)
{
tata[i] = i;
rang[i] = 1;
}
kruskal();
fout<<cost_total<<'\n';
for(int i=0;i<apm.size();i++)
fout<<apm[i].first<<" "<<apm[i].second<<'\n';
return 0;
}