#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void hanoi(int n, int *from, int *mid, int *to);
void push(int value, int *top);
int pop(int *top);
void print(char plate, int h[], int n);

int k, n;
int *a, *b, *c;   //製作三個堆疊用 
int *top_a, *top_b, *top_c;  
 
int main()
{
    int i;
 
    scanf("%d",&n);
 	k = n;
 	
    a = (int*)malloc(sizeof(int)*n);
    b = (int*)malloc(sizeof(int)*n);
    c = (int*)malloc(sizeof(int)*n);
    memset(a, 0, sizeof(int)*n);
    memset(b, 0, sizeof(int)*n);
    memset(c, 0, sizeof(int)*n);
	top_a = a;
	top_b = b;
    top_c = c;
    
    for(i = 0; i < n; i++)
	{
    	*top_a = k;
    	if(i != n-1) 
    		top_a++;
    	k--;
	}
	
	k = n;
	hanoi(n, top_a, top_b, top_c);
    return 0;
}

void hanoi(int n, int *from, int *mid, int *to)
{
	if(n == 0)
        return ;
    hanoi(n-1, from, to, mid);
    push(pop(from),to);
    print('A', a, k);
	print('B', b, k);
	print('C', c, k);
	printf("\n");
	hanoi(n-1, mid, from, to); 
}

void push(int value, int *top)
{
    *top = value;
    top++;
}

int pop(int *top)
{
    int temp;

    if(*top == -1 ) //判斷堆疊是否為空的
        return -1;
    temp = *top;
    *top = 0;
    top--;
    return temp;
}

void print(char plate, int h[], int n)
{
	int i;
	printf("Tower %c:  ",plate);
	for(i = 0; i < n; i++)
		printf("%d  ",h[i]);	
	printf("\n");
}