import java.util.Stack;

class Tower extends Stack
{	private int Number;
	public Tower (int number)
	{	Number=number;
	}
	
	// push mit Test, ob oberstes Element kleiner ist
	public void push (int value)
	{	if (empty() || ((Integer)peek()).intValue()>value)
			super.push(new Integer(value));
		else System.out.println("Illegal move");
	}
	
	public int number ()
	{	return Number;
	}
}

public class Test
{	static Tower A,B,C;

	static public void main (String args[])
	{	int n=4;
		// Tuerme beschaffen:
		A=new Tower(1); B=new Tower(2); C=new Tower(3);
		// Turm A auffuellen
		for (int i=n; i>=1; i--) A.push(i);
		// Problem loesen:
		move(n,A,B,C);
	}

	// Rekursive move-Methode
	static void move (int n, Tower a, Tower b, Tower c)
	{	if (n==1)
		{	b.push(a.pop()); // tatsaechliche Simulation der Bewegung
			System.out.println("Move disk from "+a.number()+" to "+b.number());
				// Ausdruck der Bewegung
		}
		else
		{	move(n-1,a,c,b);
			move(1,a,b,c);
			move(n-1,c,b,a);
		}
	}
}
