#include<iostream>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100001;
struct Node{
int address;
int data;
int next;
}node[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int first,n;
cin>>first>>n;
for(int i=0;i<n;i++){
int temp1,temp2,temp3;
cin>>temp1>>temp2>>temp3;
node[temp1].address=temp1;
node[temp1].data=temp2;
node[temp1].next=temp3;
}
int flag[MAXN]={};
int temp=first;
vector<Node> r1,r2;
int cnt=0;
while(temp!=-1){
if(flag[abs(node[temp].data)]==0){
Node tt=node[temp];
r1.push_back(tt);
flag[abs(node[temp].data)]=1;
temp=node[temp].next;
}else{
Node tt=node[temp];
r2.push_back(tt);
temp=node[temp].next;
cnt++;
}
}
int i;
for(i=0;i<r1.size()-1;i++){
r1[i].next=r1[i+1].address;
}
r1[i].next=-1;
if(cnt>0){
int j;
for(j=0;j<r2.size()-1;j++){
r2[j].next=r2[j+1].address;
}
r2[j].next=-1;}
if(r1.size()!=0){
for(int t=0;t<r1.size()-1;t++){
printf("%05d %d %05d\n",(r1[t]).address,(r1[t]).data,(r1[t]).next);
}
printf("%05d %d %d\n",r1[r1.size()-1].address,r1[r1.size()-1].data,r1[r1.size()-1].next);
}
if(r2.size()==0) return 0;
for(int t=0;t<r2.size()-1;t++){
printf("%05d %d %05d\n",r2[t].address,r2[t].data,r2[t].next);
}
printf("%05d %d %d\n",r2[r2.size()-1].address,r2[r2.size()-1].data,r2[r2.size()-1].next);
r1.clear();
r2.clear();
return 0;
}