#!/usr/local/bin/python
from sys import argv

class spindle:
	def __init__(self, size, number):
		self.stack = []
		for i in range(0,size):
			self.stack.append(None)
		self.index = 0
		self.number = number
	def push(self, disc):
		if self.index >= len(self.stack):
			print "Abort: Push over top"
			self.printme()
			raise SystemExit
		elif self.index == 0:
			self.stack[self.index] = disc
		elif self.stack[self.index-1].size < disc.size:
			print "Abort: Push on smaller disc"
			self.printme()
			raise SystemExit
		else:
			self.stack[self.index] = disc
		self.index = self.index + 1
		disc.place(self)
	def pop(self):
		if self.index == 0:
			print "Abort: Pop off empty spindle"
			self.printme()
			raise SystemExit
		else:
			self.index = self.index - 1
			return self.stack[self.index]
	def bottom(self):
		if self.index > 0:
			return self.stack[0]
		else:
			return None
	def over(self, disc):
		for i in range(0, self.index-1):
			if self.stack[i] == disc:
				return self.stack[i+1]
		return None
	def under(self, disc):
		retval = None
		for i in range(self.index-1, -1, -1):
			if self.stack[i].size < disc.size:
				retval = self.stack[i]
		return retval
	def printme(self):
		print "->",
		for i in range(0, self.index):
			print "%2d" % self.stack[i].size,
		print

class disc:
	def __init__(self, size):
		self.size = size
	def place(self, spindle):
		self.spindle = spindle
	def moveto(self, spindle):
		third = spindles[6 - self.spindle.number - spindle.number - 1]
		over = self.spindle.over(self)
		under = spindle.under(self)
		if over or under:
			if over and under:
				if over.size > under.size:
					over.moveto(third)
				else:
					under.moveto(third)
			elif over:
				over.moveto(third)
			elif under:
				under.moveto(third)
		else:
			self.spindle.pop()
			spindle.push(self)
			return
		self.moveto(spindle)
		return

def main(size):
	global spindles
	spindles = (spindle(size, 1), spindle(size, 2), spindle(size, 3))
	for i in range(size, 0, -1):
		spindles[0].push(disc(i))
	one = spindles[0].bottom()
	three = spindles[2].bottom()
	while one or three:
		if three and one:
			if one.size > three.size:
				one.moveto(spindles[1])
			else:
				three.moveto(spindles[1])
		elif one:
			one.moveto(spindles[1])
		elif three:
			three.moveto(spindles[1])
		one = spindles[0].bottom()
		three = spindles[2].bottom()
	spindles[0].printme()
	spindles[1].printme()
	spindles[2].printme()

if __name__=="__main__":
	main(int(argv[1]))
