#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include <algorithm>//fill()在里面
#include <cmath>
#include<queue>
#include<unordered_set>
#include<set>
#include <cstdlib>//貌似是free,malloc等函数的头文件
using namespace std;
//A1133 对比A1052
const int INF=1e9; //fill(map[0],map[0]+maxn*maxn,INF);
const int maxn=100010;
//链表节点存储结构
struct node{
int data;
int next;
int id;
}temp;
//由于要利用下标,所以使用数组或者申明了大小的变长数组
node crude[maxn];
vector<node> list,ans;
//list存放链表数据,ans存放最后排序之后的结果
int main(){
int head,n,k;//k划分list list划分为三段(-,0)[0,k],(k,+):一组内的数字的相对位置不变
scanf("%d%d%d",&head,&n,&k);
//address非负五位数
//考察静态表示链表
int pos;
while(n--){
//得根据头结点把在该链表上的节点选出来
scanf("%d",&pos);
scanf("%d%d",&crude[pos].data,&crude[pos].next);
crude[pos].id=pos;
}
// int index=0;
for(int i=head;i!=-1;i=crude[i].next){
//i迭代的是下标地址;按链表的顺序放入容器中
list.push_back(crude[i]);
}
//划分链表三份 :暴力遍历??遍历三遍?反正是线性。。。
//[-,0)[0,k](k,+]
for(int i=0;i<list.size();i++){
if(list[i].data<0){
ans.push_back(list[i]);
}
}
for(int i=0;i<list.size();i++){
if(list[i].data<=k && list[i].data>=0){
ans.push_back(list[i]);
}
}
for(int i=0;i<list.size();i++){
if(list[i].data>k){
ans.push_back(list[i]);
}
}
//输出
int last=ans.size()-1;
for(int i=0;i<ans.size()-1;i++){
//用cout就输不出格式了
// cout<<ans[i].id<<" "<<ans[i].data<<" "<<ans[i+1].id<<endl;//ans[i].next 缺了head的next节点
printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
}
//输出最后一行:不能用ans[last].next:因为最后一个节点在最开始的初始化next可能不是-1
// cout<<ans[last].id<<" "<<ans[last].data<<" "<<ans[last].next<<endl;//ans[i].next 缺了head的next节点
printf("%05d %d -1",ans[last].id,ans[last].data);
return 0;
}