#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct muchie
{
int x,y,c;
}v[400005];
int t[200005],r[200005];
unsigned int sm;
void swag(muchie &a, muchie &b)
{
muchie aux;
memcpy(&aux,&a,sm);
memcpy(&a,&b,sm);
memcpy(&b,&aux,sm);
}
void heapup(int x)
{
int i=x,j;
while(i>1)
{
j=i/2;
if(v[j].c<v[i].c) {swag(v[i],v[j]);i=j;}
else break;
}
}
void heapdown(int &ncr)
{
int i,j,x;
swag(v[1],v[ncr]);
ncr--;
i=1;
while(2*i<=ncr)
{
j=2*i;
if(j+1<=ncr&&v[j].c<v[j+1].c) j++;
if(v[i].c<v[j].c) {swag(v[i],v[j]);i=j;}
else break;
}
}
void heapsort(int n)
{
int i,j,ncr=n;
sm=sizeof(muchie);
for(i=2;i<=n;i++)
{
heapup(i);
}
for(i=n;i>1;i--)
{
heapdown(ncr);
}
}
void uneste(int x, int y)
{
t[y]=x;
}
int query(int x)
{
int rad=x,aux;
while(rad!=t[rad])
rad=t[rad];
while(x!=rad)
{
aux=x;
x=t[x];
t[aux]=rad;
}
return rad;
}
int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
int n,m,i,narb,narbc=0,x,y,a,b,cost=0;
queue<int> q;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&(v[i].x),&(v[i].y),&(v[i].c));
}
heapsort(m);
for(i=1;i<=n;i++)
t[i]=i;
narb=n-1;
for(i=1;i<=m&&narbc<narb;i++)
{
x=v[i].x;
y=v[i].y;
a=query(x);
b=query(y);
if(a==b) continue;
if(r[a]>=r[b])
uneste(a,b);
else uneste(b,a);
if(r[a]==r[b]) r[a]++;
cost+=v[i].c;
q.push(i);
narbc++;
}
printf("%d\n%d\n",cost,narb);
while(!q.empty())
{
printf("%d %d\n",v[q.front()].x,v[q.front()].y);
q.pop();
}
return 0;
}