1 // 写了挺久的说 = = 谢谢指导我的学长~
2 // 弄懂之后还是不难的(记性不好啊= = 希望我不要太快忘了才好 )
3 #include<cstdio>
4 #include<cstring>
5 #include<algorithm>
6 #define MAX 3010
7 using namespace std;
8 char dir[6][10]={"front", "back", "left", "right", "top" , "bottom"};
9 struct cube
10 {
11 int weight,top,bot,dir;
12 void init(int w,int t,int b,int d)
13 {
14 weight=w; top=t; bot=b; dir=d;
15 }
16 }a[MAX];
17 int f[MAX],path[MAX];
18 void print(int x)
19 {
20 if(x==-1) return ;
21 print(path[x]);
22 printf("%d %s\n",a[x].weight,dir[a[x].dir]);
23 }
24 int main()
25 {
26 int n,cnt=0;
27 int cl[6];
28 while(scanf("%d",&n)!=EOF && n)
29 {
30 int sum=0;
31 for(int i=0;i<n;i++)
32 {
33 for(int j=0;j<6;j++)
34 scanf("%d",&cl[j]);
35 for(int j=0;j<6;j++)
36 {
37 if(j%2) a[sum++].init(i+1,cl[j],cl[j-1],j); //记录底面和顶面
38 else a[sum++].init(i+1,cl[j],cl[j+1],j);
39 }
40 }
41 memset(path,-1,sizeof(path));
42 int mx=-1,p=0 ; f[0]=1;
43 for(int i=1;i<sum;i++)
44 {
45 f[i]=1;
46 for(int j=0;j<i;j++)
47 {
48 if(a[i].weight > a[j].weight && a[i].top == a[j].bot && f[j]+1>f[i] ) // LIS
49 {
50 f[i]=f[j]+1;
51 path[i]=j;
52 if(f[i]>mx) mx=f[i],p=i;
53 }
54 }
55 }
56 if(cnt) printf("\n");
57 printf("Case #%d\n%d\n",++cnt,mx);
58 print(p);
59 }
60 return 0;
61 }