#include<bits/stdc++.h>
#include<set>
#include<cstdio>
#include<iomanip>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#define pb push_back
#define ll long long
#define fi first
#define se second
#define PI 3.14159265
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define eps 1e-7
#define pii pair<int,int>
typedef unsigned long long ull;
const int mod=1e3+5;
const ll inf=0x3f3f3f3f3f3f3f;
const int maxn=1e3+5;
using namespace std;
struct edge
{
int l,u,v;
bool operator<(const edge b)const
{
return l<b.l;
}
};
multiset<edge>et;
int fa[maxn],n,m;
int f(int x)
{
if(x==fa[x])
{
return fa[x];
}
return fa[x]=f(fa[x]);
}
void _merge(int x,int y)
{
fa[f(y)]=f(x);
}
void init(int num)
{
for(int i=1;i<=num;i++)
{
fa[i]=i;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
init(n);
for(int i=1;i<=m;i++)
{
edge tmp;
cin>>tmp.v>>tmp.u>>tmp.l;
et.insert(tmp);
}
cout<<endl;
int num=n-1,len=0;
while(num--)
{
bool flag=true;
while(flag)
{
edge tmp=*et.begin();
// cout<<tmp.u<<" "<<tmp.v<<" "<<tmp.l<<endl;
if(f(tmp.u)!=f(tmp.v))
{
len+=tmp.l;
cout<<tmp.u<<" "<<tmp.v<<" "<<tmp.l<<endl;
flag=false;//cout<<"SSS"<<endl;
_merge(tmp.v,tmp.u);
}
et.erase(et.begin());
}
}
cout<<"需要用到的边的总长度为"<<len<<endl;
return 0;
}
/*
5 8
1 3 3
1 2 2
1 4 3
1 5 4
3 5 3
4 5 5
2 4 3
3 2 1
*/