#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,e,g[105][105],r,s,t;
bool flag[105];
struct Edge{
int from,id,w;
Edge(){}; Edge(int argfrom,int argid,int argw){
from=argfrom;
id=argid;
w=argw;
}
friend bool operator<(Edge a,Edge b){
return a.w>b.w; }
};
priority_queue<Edge> pque; vector<Edge> Prim(int sid){
vector<Edge> result; memset(flag,false,sizeof(flag));
pque.push(Edge(-1,sid,0));
while(result.size()<n-1){
Edge ed=pque.top();
pque.pop();
if(flag[ed.id])continue;
flag[ed.id]=true;
if(ed.from!=-1)result.push_back(ed); for(int i=1;i<=n;++i){ if(!flag[i] && g[ed.id][i]<0x3f3f3f3f){
pque.push(Edge(ed.id,i,g[ed.id][i]));
}
}
}
return result;
}
int main(){
memset(g,0x3f,sizeof(g));
cin>>n>>e;
for(int i=1;i<=e;++i){
cin>>r>>s>>t;
g[r][s]=g[s][r]=t;
}
vector<Edge>Edges=Prim(1);
for(int i=0;i<Edges.size();++i){
cout<<Edges[i].from<<" "<<Edges[i].id<<endl;
}
return 0;
}