#include <bits/stdc++.h>
using namespace std;
class disjointset{
vector<int> size,parent;
public:
disjointset(int n){
size.resize(n+1);
parent.resize(n+1);
for(int i=0;i<n;i++){
parent[i] = i;
size[i] = 1;
}
}
int findUparent(int node){
if(node == parent[node]){
return node;
}
return parent[node] = findUparent(parent[node]);
}
int unionbysize(int u,int v){
int up_u = findUparent(u);
int up_v = findUparent(v);
if(size[up_u] < size[up_v]){
parent[up_u] = up_v;
size[up_v] += size[up_u];
}
else{
parent[up_v] = up_u;
size[up_u] += size[up_v];
}
}
};
int main() {
int V,E;
cin>>V>>E;
vector<pair<int,pair<int,int>>> edge;
for(int i=0;i<E;i++){
int u,v,wt;
cin>>u>>v>>wt;
if(u<V || v<V){
edge.push_back({wt,{u,v}});
}
}
sort(edge.begin(),edge.end());
disjointset ds(V);
vector<pair<pair<int,int>,int>> ans;
for(auto it:edge){
int wt = it.first;
int u = it.second.first;
int v = it.second.second;
if(ds.findUparent(u) != ds.findUparent(v)){
ds.unionbysize(u,v);
if(u<v){
// cout<<u<<v<<wt<<endl;
ans.push_back({{u,v},wt});
}
else{
// cout<<v<<u<<wt<<endl;
ans.push_back({{v,u},wt});
}
}
}
for(int it=ans.size()-1;it>=0;it--){
cout<<ans[it].first.first<<" ";
cout<<ans[it].first.second<<" ";
cout<<ans[it].second;
cout<<endl;
}
return 0;
}