/*
#include <cstdio>
#include <algorithm>
using namespace std;
struct muchie
{
int i, j, cost;
friend bool operator < (const muchie &a, const muchie &b)
{
return a.cost < b.cost;
}
};
muchie v[400005];
int n, m, t[200005], a[200005], h[200005];
int radacina(int x)
{
int y = x, tmp;
while (t[x])
x = t[x];
while (t[y]) //smecherie tare
tmp = t[y], t[y] = x, y = tmp;
return x;
}
int main()
{
FILE *f = fopen("apm.in", "r");
fscanf(f, "%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
fscanf(f, "%d%d%d", &v[i].i, &v[i].j, &v[i].cost);
fclose(f);
sort(v+1, v+m+1);
int na = 0, cost = 0;
for (int i = 1; i <= m; ++i)
{
int ri = radacina(v[i].i), rj = radacina(v[i].j);
if (ri != rj)
{
if (h[ri] < h[rj])
t[ri] = rj;
else
if (h[ri] > h[rj])
t[rj] = ri;
else
t[ri] = rj, h[rj]++;
a[++na] = i, cost += v[i].cost;
}
}
f = fopen("apm.out", "w");
fprintf (f, "%d\n%d\n", cost, n-1);
for (int i = 1; i <= n - 1; ++i)
fprintf(f, "%d %d\n", v[ a[i] ].i, v[ a[i] ].j);
fclose(f);
return 0;
}
*/
#include <cstdio>
struct nod
{
int vf, cost;
nod *next;
};
nod *graf[200002];
int n, m, t[200002], v[200002], d[200002], H[200002],vpoz[200002], nH;
void addMuchie (int i, int j, int c)
{
nod *p = new nod;
p -> vf = j;
p -> cost = c;
p -> next = graf[i];
graf[i] = p;
}
void swap (int &a, int &b)
{
int aux = a;
a = b;
b = aux;
}
void sterge(int nodul)
{
H[nodul] = H[nH--];
vpoz[H[nodul]]=nodul;
int esteHeap = 0, i=nodul, k;
while (!esteHeap && 2 * i <= nH)
{
k = 2 * i;
if (k + 1 <= nH && d[H[k]] > d[H[k]])
++k;
if (d[H[k]] > d[H[i]])
esteHeap = 1;
else
{
swap(H[i], H[k]);
vpoz[H[i]] = i;
vpoz[H[k]] = k;
i = k;
}
}
}
void promoveaza(int nodul)
{
int esteHeap = 0, i = nodul;
while (!esteHeap && i>1)
{
if (d[H[i]] >= d[H[i/2]])
esteHeap = 1;
else
{
swap (H[i], H[i/2]);
vpoz[H[i]] = i;
vpoz[H[i/2]] = i/2;
i=i/2;
}
}
}
int main()
{
FILE *f = fopen("apm.in", "r");
fscanf(f, "%d%d", &n, &m);
nH = n;
int x, y, c;
for (int i = 1; i <= m; ++i)
{
fscanf(f, "%d%d%d", &x, &y, &c);
addMuchie (x, y, c);
addMuchie (y, x, c);
}
fclose(f);
for (int i = 0; i <= n; ++i)
{
t[i] = -1, v[i] = 0, d[i] = (1 << 30);
H[i] = i, vpoz[i] = i;
}
sterge(1);
t[1] = 0;
v[1] = 1;
d[1] = 0;
for (nod *p = graf[1]; p; p = p -> next)
d[p->vf] = p -> cost, t[p->vf] = 1, promoveaza(p->vf);
int cost = 0;
for (int k = 1; k < n; ++k)
{
int pmin = H[1];
sterge(1);
v[pmin] = 1;
cost += d[pmin];
for (nod *p = graf[pmin]; p; p = p -> next)
if (d[p->vf] > p -> cost && !v[p->vf])
d[p->vf] = p -> cost, t[p->vf] = pmin, promoveaza(vpoz[p->vf]);
}
f = fopen ("apm.out", "w");
fprintf (f, "%d\n%d\n", cost, n - 1);
for (int i = 1; i <= n; ++i)
if (t[i] != 0)
fprintf (f, "%d %d\n", i, t[i]);
fclose(f);
return 0;
}