#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;//最多的节点数量
struct node
{
int key,next;
}orignal[N];
struct Ans
{
int address,key,next;
}ans[N],negative[N],positive_k[N],positive[N],res[N];//ans表示链接好的链表,negative表示链接好的负数链表,positive_k表示链接好小于等于k的正数链表,positive表示链接好的大于k的正数链表
int main()
{
int start,n,k;//start表示初始节点,n表示节点总数,k表示划分边界
scanf("%d%d%d",&start,&n,&k);
for(int i=0;i<n;i++)//遍历n次
{
int address,key,next;
scanf("%d%d%d",&address,&key,&next);
orignal[address]={key,next};
}
int cnt=0;//链表元素的个数,因为其中可能存在没有用的节点
for(int i=start;i!=-1;i=orignal[i].next)//将链表按序号排好
ans[cnt++]={i,orignal[i].key,-1};//下一个指向的节点设置为-1,因为我们暂时还不知道要去哪
int cnt_neg=0;
int cnt_pos_k=0;
int cnt_pos=0;
for(int i=0;i<cnt;i++)//遍历链表元素
{
if(ans[i].key<0)//如果元素的值小于0,那么我就直接将他移到negative去就可以了
negative[cnt_neg++]={ans[i].address,ans[i].key,-1};
else if(ans[i].key<=k)//如果元素的值大于0,并且小于等于k的话,呢么我们将其加到positive_k中
positive_k[cnt_pos_k++]={ans[i].address,ans[i].key,-1};
else if(ans[i].key>k)//如果元素的值大于0,并且大于k的话,直接插入到positive中
positive[cnt_pos++]={ans[i].address,ans[i].key,-1};
}
int all_cnt=0;//记录所有的元素
if(cnt_neg!=0)//如果有负数的元素
{
for(int i=0;i<cnt_neg;i++)
res[all_cnt++]=negative[i];
}
if(cnt_pos_k!=0)
{
for(int i=0;i<cnt_pos_k;i++)
res[all_cnt++]=positive_k[i];
}
if(cnt_pos!=0)
{
for(int i=0;i<cnt_pos;i++)
res[all_cnt++]=positive[i];
}
for(int i=0;i<=all_cnt-2;i++)
printf("%05d %d %05d\n",res[i].address,res[i].key,res[i+1].address);
printf("%05d %d %d\n",res[all_cnt-1].address,res[all_cnt-1].key,-1);
return 0;
}