/*　２分木のすべての節点を巡回するプログラム　*/
#include <stdio.h>

#define NIL -1
#define MAX 25     /*　最大の節点数　*/

struct node{

  int id;
  int left;
  int right;
  int parent;
};

struct node T[MAX];       /*　二分木　*/

void preorder(int);
void inorder(int);
void postorder(int);

int main()
{
  int i, j, n, num, root, l, r;

  /*　二分木をNILで初期化　*/
  for( i = 0; i<MAX; i++ )
    T[i].left = T[i].right = T[i].parent = NIL;

  /*　n個の節点を読み込む　*/
  scanf("%d", &n);
  for( i = 0; i<n; i++ )
    {
      scanf("%d%d%d", &num, &l, &r);

      T[num].id    = num;
      T[num].left  = l;
      T[num].right = r;

      /* 左の子の親を設定　*/
      if( l != NIL )
	T[ l ].parent  = num;
      /*　右の子の親を設定　*/
      if( r != NIL )
	T[ r ].parent = num;
    }

  /* rootノードを求める　*/
  for( i = 0; i<n; i++ )
    {
      if( T[i].parent == NIL )
	{
	  root = i;
	  break;
	}
    }
  
  /*　二分木を先行順巡回によって出力　*/
  printf("Preorder\n");
  preorder(root);
  /*　二分木を中間順巡回によって出力　*/
  printf("\nInorder\n");
  inorder(root);
  /*　二分木を後行順巡回によって出力　*/
  printf("\nPostorder\n");
  postorder(root);
  printf("\n");
  
  return 0;
}

/* 二分木Tに先行順巡回を行った節点番号を順番に出力する関数　*/
void preorder(int n)
{
  if( n == NIL )
    return;
  
  printf(" %d", T[n].id);
  preorder( T[n].left );
  preorder( T[n].right );
}

/*　二分木Tに中間順巡回を行った節点番号を順番に出力する関数　*/
void inorder(int n)
{
  if( n == NIL )
    return;

  inorder( T[n].left);
  printf(" %d", T[n].id);
  inorder( T[n].right);
}

/*　二分木Tに後行順巡回を行った節点番号を順番に出力する関数　*/
void postorder(int n)
{
  if( n == NIL )
    return;

  postorder( T[n].left );
  postorder( T[n].right );
  printf(" %d", T[n].id);
}

