#include <stdio.h>

#define MAX 10000
#define NIL -1

// 構造体の宣言 親 子(左) 子(右)
struct Node {int p, l, r;};
struct Node T[MAX];
int n;

/* 先行順巡回 */
void preParse(int u) {
    // もしノードが存在しない(-1だった場合)は関数を終わる
    if(u == NIL) return;
    // 前で出力する(前順)
    printf(" %d",u);
    // 先に左の子へ行って処理をする
    preParse(T[u].l);
    // 左の子の処理が終わったら右の子に行く
    preParse(T[u].r);
}

/* 中間順巡回 */
void inParse(int u) {
    // もしノードが存在しない(-1だった場合)は関数を終わる
    if(u == NIL) return;
    // 先に左の子へ行って処理をする
    inParse(T[u].l);
    // 中で出力する(中順)
    printf(" %d",u);
    // 左の子の処理が終わったら右の子に行く
    inParse(T[u].r);
}

/* 後方順巡回 */
void postParse(int u) {
    // もしノードが存在しない(-1だった場合)は関数を終わる
    if(u == NIL) return;
    // 先に左の子へ行って処理をする
    postParse(T[u].l);
    // 左の子の処理が終わったら右の子に行く
    postParse(T[u].r);
    // 後で出力する(後順)
    printf(" %d",u);
}

int main(void) {
    int i, v, l, r, root;
    // ノードの個数取得
    scanf("%d",&n);
    // ノードの個数分だけ初期化
    for(i=0; i<n; i++) {
        T[i].p = NIL;
    }

    for(i=0; i<n; i++) {
        scanf("%d %d %d",&v,&l,&r);
        // 取得した左右の子を代入
        T[v].l = l;
        T[v].r = r;
        // もし子がいた場合(-1以外だった時)子のノードの親を設定する
        if(l != NIL) T[l].p = v;
        if(r != NIL) T[r].p = v;
    }

    // 親がいないノードがあった場合そこが根になる
    for(i=0;i<n;i++) if(T[i].p == NIL) root = i;

    // 先行順巡回 (Preorder Tree Walk)の出力
    printf("Preorder\n");
    preParse(root);
    printf("\n");

    // 中間順巡回 (Inorder Tree Walk)の出力
    printf("Inorder\n");
    inParse(root);
    printf("\n");

    // 後行順巡回 (Postorder Tree Walk)の出力
    printf("Postorder\n");
    postParse(root);
    printf("\n");

    return 0;
}
