struct edge{
int v;//这条边指向的点
int w;//该边的权值
int ne;//下一条边
}e[maxn];
int h[maxn];//存节点i的头边编号
int idx;//边的编号
void add(int a,int b,int c){
e[idx]={b,c,h[a]};
h[a]=idx++;
}
void dfs(int u,int fa){
for(int i=h[u];i>=0;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(v==fa)continue;
cout<<u<<' '<<v<<' '<<w<<endl;
dfs(v,u);
}
}
void lsqxx(){
int n,m;cin>>n>>m;
memset(h,-1,sizeof(h));//初始化头边
rep(i,1,m){
int a,b,c;cin>>a>>b>>c;
//a:该边去往的点
//b:该边开始的点
//c:该边的权值
add(a,b,c);
add(b,a,c);
}
dfs(1,0);
}
void solve(){
lsqxx();
}