#include <fstream>
#include <algorithm>
const int NMAX = 2e5;
const int MMAX = 4e5;
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct muchie
{
int a,b;
int cost;
bool ales;
}v[MMAX+1];
int n,m;
int tata[NMAX+1];
bool cmp(muchie x, muchie y)
{
return x.cost < y.cost ? 1:0;
}
int sefsuprem(int nod)
{
if(tata[nod] == nod)
return nod;
return tata[nod] = sefsuprem(tata[nod]);
}
void unite(int a, int b)
{
int sefa = sefsuprem(a);
int sefb = sefsuprem(b);
tata[sefa] = sefb;
return;
}
bool isroad(int a, int b)
{
return sefsuprem(a) == sefsuprem(b);
}
int main()
{
in >> n >> m;
for(int i = 1; i <= m; i++)
{
in >> v[i].a >> v[i].b >> v[i].cost;
tata[v[i].a]=v[i].a;
tata[v[i].b]=v[i].b;
}
sort(v+1, v+m+1, cmp);
int cnt = 0;
int sum = 0;
for(int i = 1; i <= m && cnt < n-1; i++)
{
if(!isroad(v[i].a,v[i].b))
{
cnt++;
sum+=v[i].cost;
v[i].ales = 1;
unite(v[i].a, v[i].b);
}
}
out << sum << "\n";
for(int i = 1; i <= m; i++)
if(v[i].ales)
out << v[i].a << " " << v[i].b << "\n";
return 0;
}