1 #include<iostream>
2 #include<string>
3 using namespace std;
4 int n;
5 int block[25][25];
6 int top[25];
7 string str;
8 void num(int index,int &a,int &b)
9 {
10 a=0,b=0;
11 int i=5;
12 while(i<=index-2)
13 a=str[i++]-'0'+a*10;
14 index=index+5;
15 while(str[index]!='\0')
16 b=str[index++]-'0'+b*10;
17 }
18 void find(int value,int &x,int &y)
19 {
20 for(int i=0;i<n;i++)
21 for(int j=0;j<=top[i];j++)
22 if(block[i][j]==value)
23 {
24 x=i;
25 y=j;
26 break;
27 }
28 }
29 void move_onto(int a,int b)
30 {
31 int xa,ya,i;
32 find(a,xa,ya);
33 int xb,yb;
34 find(b,xb,yb);
35 if(xa==xb)
36 return;
37 for(i=ya+1;i<=top[xa];i++)
38 {
39 int index=block[xa][i];
40 top[index]++;
41 block[index][top[index]]=index;
42 }
43 top[xa]=ya-1;
44 for(i=yb+1;i<=top[xb];i++)
45 {
46 int index=block[xb][i];
47 top[index]++;
48 block[index][top[index]]=index;
49 }
50 top[xb]=yb;
51 block[xb][yb+1]=a;
52 top[xb]++;
53 }
54 void move_over(int a,int b)
55 {
56 int xa,ya;
57 find(a,xa,ya);
58 int xb,yb;
59 find(b,xb,yb);
60 if(xa==xb)
61 return;
62 for(int i=ya+1;i<=top[xa];i++)
63 {
64 int index=block[xa][i];
65 top[index]++;
66 block[index][top[index]]=index;
67 }
68 top[xa]=ya-1;
69 block[xb][top[xb]+1]=a;
70 top[xb]++;
71 }
72 void pile_onto(int a,int b)
73 {
74 int xb,yb,i;
75 find(b,xb,yb);
76 int xa,ya;
77 find(a,xa,ya);
78 if(xa==xb)
79 return;
80 for(i=yb+1;i<=top[xb];i++)
81 {
82 int index=block[xb][i];
83 top[index]++;
84 block[index][top[index]]=index;
85 }
86 top[xb]=yb;
87 for(i=ya;i<=top[xa];i++)
88 {
89 top[xb]++;
90 block[xb][top[xb]]=block[xa][i];
91 }
92 top[xa]=ya-1;
93 }
94 void pile_over(int a,int b)
95 {
96 int xb,yb;
97 find(b,xb,yb);
98 int xa,ya;
99 find(a,xa,ya);
100 if(xa==xb)
101 return;
102 for(int i=ya;i<=top[xa];i++)
103 {
104 top[xb]++;
105 block[xb][top[xb]]=block[xa][i];
106 }
107 top[xa]=ya-1;
108 }
109 int main()
110 {
111 while(cin>>n)
112 {
113 int i;
114 for(i=0;i<n;i++)
115 for(int j=0;j<n;j++)
116 block[i][j]=-1;
117 for(i=0;i<n;i++)
118 block[i][0]=i;
119 for(i=0;i<n;i++)
120 top[i]=0;
121 getchar();
122
123 while(getline(cin,str))
124 {
125 if(!str.compare("quit"))
126 break;
127 else
128 {
129 int a,b,index=0;
130 if(!str.compare(0,4,"move"))
131 {
132 if(str.find("onto")!=string::npos)
133 {
134 index=str.find("onto");
135 num(index,a,b);
136 move_onto(a,b);
137 }
138 else
139 {
140 index=str.find("over");
141 num(index,a,b);
142 move_over(a,b);
143 }
144 }
145 else
146 {
147 if(str.find("onto")!=string::npos)
148 {
149 index=str.find("onto");
150 num(index,a,b);
151 pile_onto(a,b);
152 }
153 else
154 {
155 index=str.find("over");
156 num(index,a,b);
157 pile_over(a,b);
158 }
159 }
160 }
161 getchar();
162 }
163 for(i=0;i<n;i++)
164 {
165 cout<<i<<": ";
166 for(int j=0;j<=top[i];j++)
167 cout<<block[i][j]<<" ";
168 cout<<endl;
169 }
170 }
171 return 0;
172 }