import java. io. *;
import java. util. Arrays;
public class Main {
private static final int MAX_NODE_NUMBER = 100000 ;
private static BufferedReader input;
private static int headAddress;
private static int totalNode;
private static int intervalMaximum;
private static int [ ] [ ] inputList;
private static int [ ] [ ] originalList;
private static int [ ] [ ] resultList;
private static void initBufferedReader ( ) {
InputStream is = System. in;
InputStreamReader isr = new InputStreamReader ( is) ;
input = new BufferedReader ( isr) ;
}
private static void inputData ( ) {
String str = getLine ( ) ;
String[ ] arr = str. split ( " " ) ;
headAddress = Integer. parseInt ( arr[ 0 ] ) ;
totalNode = Integer. parseInt ( arr[ 1 ] ) ;
intervalMaximum = Integer. parseInt ( arr[ 2 ] ) ;
inputList = new int [ MAX_NODE_NUMBER] [ 2 ] ;
for ( int i = 0 ; i < totalNode; ++ i) {
str = getLine ( ) ;
arr = str. split ( " " ) ;
int address = Integer. parseInt ( arr[ 0 ] ) ;
inputList[ address] [ 0 ] = Integer. parseInt ( arr[ 1 ] ) ;
inputList[ address] [ 1 ] = Integer. parseInt ( arr[ 2 ] ) ;
}
}
private static String getLine ( ) {
String str = "" ;
try {
str = input. readLine ( ) ;
} catch ( IOException e) {
}
return str;
}
private static void getOriginalList ( ) {
int tail = headAddress;
int number = 0 ;
originalList = new int [ totalNode] [ 2 ] ;
while ( tail >= 0 ) {
originalList[ number] [ 0 ] = tail;
originalList[ number++ ] [ 1 ] = inputList[ tail] [ 0 ] ;
tail = inputList[ tail] [ 1 ] ;
}
originalList = Arrays. copyOf ( originalList, number) ;
}
private static void getResultList ( ) {
int number = 0 ;
int length = originalList. length;
resultList = new int [ length] [ 2 ] ;
for ( int i = 0 ; i < length; ++ i) {
if ( originalList[ i] [ 1 ] < 0 ) {
resultList[ number] [ 0 ] = originalList[ i] [ 0 ] ;
resultList[ number++ ] [ 1 ] = originalList[ i] [ 1 ] ;
}
}
for ( int i = 0 ; i < length; ++ i) {
if ( originalList[ i] [ 1 ] < 0 ) {
continue ;
}
if ( originalList[ i] [ 1 ] > intervalMaximum) {
continue ;
}
resultList[ number] [ 0 ] = originalList[ i] [ 0 ] ;
resultList[ number++ ] [ 1 ] = originalList[ i] [ 1 ] ;
}
for ( int i = 0 ; i < length; ++ i) {
if ( originalList[ i] [ 1 ] > intervalMaximum) {
resultList[ number] [ 0 ] = originalList[ i] [ 0 ] ;
resultList[ number++ ] [ 1 ] = originalList[ i] [ 1 ] ;
}
}
}
private static void outputResultList ( ) {
int length = resultList. length - 1 ;
for ( int i = 0 ; i < length; ++ i) {
System. out. printf ( "%05d " , resultList[ i] [ 0 ] ) ;
System. out. print ( resultList[ i] [ 1 ] ) ;
System. out. printf ( " %05d\n" , resultList[ i + 1 ] [ 0 ] ) ;
}
System. out. printf ( "%05d " , resultList[ length] [ 0 ] ) ;
System. out. print ( resultList[ length] [ 1 ] ) ;
System. out. println ( " -1" ) ;
}
public static void main ( String[ ] args) {
initBufferedReader ( ) ;
inputData ( ) ;
getOriginalList ( ) ;
getResultList ( ) ;
outputResultList ( ) ;
}
}
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100005
struct LinkNode
{
int address;
int data;
int next;
} node[ MAX] ;
int main ( )
{
int Head, N, K;
cin >> Head >> N >> K;
for ( int i = 0 ; i < N; i++ )
{
int temp;
cin >> temp;
node[ temp] . address = temp;
cin >> node[ temp] . data >> node[ temp] . next;
}
vector< LinkNode> v1, v2, v3, v;
for ( int i = Head; i != - 1 ; i = node[ i] . next)
{
if ( node[ i] . data < 0 )
{
v1. push_back ( node[ i] ) ;
}
else if ( node[ i] . data <= K)
{
v2. push_back ( node[ i] ) ;
}
else
{
v3. push_back ( node[ i] ) ;
}
}
for ( auto it : v1)
{
v. push_back ( it) ;
}
for ( auto it : v2)
{
v. push_back ( it) ;
}
for ( auto it : v3)
{
v. push_back ( it) ;
}
for ( int i = 0 ; i < v. size ( ) ; i++ )
{
if ( i != v. size ( ) - 1 )
{
printf ( "%05d %d %05d\n" , v[ i] . address, v[ i] . data, v[ i+ 1 ] . address) ;
}
else
{
printf ( "%05d %d -1\n" , v[ i] . address, v[ i] . data) ;
}
}
return 0 ;
}