#include <iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
//本题理解题意错误
//错误理解:建立二叉排序树时要添加重复节点,但输出时不用
//正确理解:添加时都不用,满头大汗,什么叫不用输出啊,直接说不插入重复值不就行了,这出题水平快赶上24年408出题老头了
using namespace std;
typedef struct Binode {
    int data;
    struct Binode* lchild;
    struct Binode* rchild;
    Binode(int x): data(x), lchild(NULL), rchild(NULL) {}
};
Binode* buildTree(Binode* root, int x) {
    if (root == NULL) {
        Binode* node = new Binode(x);
        root = node;
    } else if (x > root->data) {
//        if(root->rchild!=NULL)  cout<<"下面将要遍历:"<<root->rchild->data;

        root->rchild = buildTree(root->rchild, x);

    } else if (x < root->data) {
//            if(root->rchild!=NULL)  cout<<"下面将要遍历:"<<root->lchild->data;
        root->lchild = buildTree(root->lchild, x);
    }
    return root;
}

void preVisit(Binode* root) {
    if (root == NULL) return;
    cout << root->data << " ";
    preVisit(root->lchild);
    preVisit(root->rchild);
}
void midVisit(Binode* root) {
    if (root == NULL) return;
    midVisit(root->lchild);
    cout << root->data << " ";
    midVisit(root->rchild);
}
void postVisit(Binode* root) {
    if (root == NULL) return;
    postVisit(root->lchild );
    postVisit(root->rchild);

    cout << root->data << " ";
}

int main() {
    int sum;
    while (cin >> sum) {
        Binode* root = NULL;
        while (sum > 0) {
            int x;
            scanf("%d", &x);
            root = buildTree(root, x);
            sum--;
        }

        Binode* rootpoint = root;
        preVisit(rootpoint);
        cout << "\n";
        rootpoint = root;
        midVisit(rootpoint);
        cout << "\n";
        rootpoint = root;
        postVisit(rootpoint);
        cout << "\n";
    }
    return 0;
}