1 #include <cstdio>
2 #define Null -1
3
4 const int maxn = 1e5+2;
5 struct Node {
6 int data;
7 int addr, next;
8 } Lst[maxn];
9
10
11
12 int input(int , int);
13 int change(int k, int first);
14 void printList(int first);
15 bool rearCheck(int k, int start);
16 int reverse(int head, int k);
17
18 int main() {
19 int first, n, k;
20 scanf("%d%d%d", &first, &n, &k);
21
22 int head = input(n, first);
23 int NewStart = change(k, head);
24 printList(NewStart);
25
26 return 0;
27 }
28 int input(int n, int first) {
29 for(int i=0; i<n; i++) {
30 int taddr;
31 scanf("%d", &taddr);
32 scanf("%d%d", &Lst[taddr].data, &Lst[taddr].next);
33 Lst[taddr].addr = taddr;
34 }
35 int p = 100000;
36 Lst[p].next = first;
37 return p;
38 }
39
40 int change(int k, int head) {
41 int tmp = head;
42 while( rearCheck(k, tmp) ) {
43 Lst[tmp].next = reverse(tmp, k);
44
45 for(int i=0; i<k; i++) {
46 tmp = Lst[tmp].next;
47 }
48
49 }
50 return head;
51 }
52
53 bool rearCheck(int k, int start) {
54 int cnt = 0;
55 while( cnt < k+1 ) {
56 if(start == Null) break;
57 start = Lst[start].next;
58 cnt++;
59 }
60
61 if(cnt == k+1) return true;
62 else return false;
63 }
64
65 int reverse(int head, int k) {
66 int freshStart = Lst[head].next;
67 int origStart = Lst[freshStart].next;
68 int tmp;
69
70 int cnt= 0;
71 while(cnt < k-1) {
72
73 tmp = Lst[origStart].next;
74 Lst[origStart].next = freshStart;
75 freshStart = origStart;
76 origStart = tmp;
77 cnt++;
78
79 }
80 Lst[Lst[head].next].next = origStart;
81
82 return freshStart;
83 }
84
85
86 void printList(int p) {
87 p = Lst[p].next;
88 while(p!=-1) {
89 if(Lst[p].next != -1)
90 printf("%05d %d %05d\n", Lst[p].addr, Lst[p].data, Lst[p].next);
91 else
92 printf("%05d %d -1\n", Lst[p].addr, Lst[p].data);
93 p = Lst[p].next;
94 }
95 }