#include<stdio.h>
struct tree
{
    int weight;
    int left;
    int right;
    int parent;
};

int search(int a,int b,struct tree paixu[])           //查找要插入的结点的父节点是哪个
{
    if(a>paixu[b].weight)
    {
        if(paixu[b].right==-1)
            return b;
        else {
            b=search(a,paixu[b].right,paixu);
            return b;
        }
    }
    if(a<=paixu[b].weight)
    {
        if(paixu[b].left==-1)
            return b;
        else {
            b=search(a,paixu[b].left,paixu);
            return b;
        }
    }
    return 0;
}

void insert(int c,int d,struct tree paixu[])             //将节点插入到查找到的节点的左或右
{
    if(paixu[c].weight>paixu[d].weight)
    {
        paixu[d].right=c;
        paixu[c].parent=d;
    }
    else
    {
        paixu[d].left=c;
        paixu[c].parent=d;
    }
}

void qianxu(int k,struct tree paixu[])          //前序遍历
{
    if(k!=-1)
    {
        int j,flag=0;
        for(j=0;j<k;j++){                         //已输出的权值不重复输出。
            if(paixu[k].weight==paixu[j].weight){
                flag=1;
            }
        }
        if(flag!=1){
            printf("%d ",paixu[k].weight);
        }
        qianxu(paixu[k].left,paixu);
        qianxu(paixu[k].right,paixu);
    }
}

void zhongxu(int k,struct tree paixu[])           //中序遍历
{
    if(k!=-1)
    {
        zhongxu(paixu[k].left,paixu);
        int j,flag=0;
        for(j=0;j<k;j++){
            if(paixu[k].weight==paixu[j].weight){
                flag=1;
            }
        }
        if(flag!=1){
            printf("%d ",paixu[k].weight);
        }
        zhongxu(paixu[k].right,paixu);
    }
}

void houxu(int k,struct tree paixu[])             //后序遍历
{
    if(k!=-1)
    {
        houxu(paixu[k].left,paixu);
        houxu(paixu[k].right,paixu);
        int j,flag=0;
        for(j=0;j<k;j++){
            if(paixu[k].weight==paixu[j].weight){
                flag=1;
            }
        }
        if(flag!=1){
            printf("%d ",paixu[k].weight);
        }
    }
}

void print(struct tree paixu[]){
    qianxu(0,paixu);
    printf("\n");
    zhongxu(0,paixu);
    printf("\n");
    houxu(0,paixu);
    printf("\n");
}

int main(){
    int x,n;
    while(scanf("%d",&n)!=EOF){
        int nums[n];
        for(int i=0;i<n;i++){
            nums[i]=-1;
        }
        struct tree paixu[n];
        scanf("%d",&paixu[0].weight);
        paixu[0].left=-1;
        paixu[0].right=-1;
        paixu[0].parent=-1;
        for(int i=1;i<n;i++)       //插入除根节点外的后续节点
        {
            scanf("%d",&paixu[i].weight);
            paixu[i].left=-1;
            paixu[i].right=-1;
            x=search(paixu[i].weight,0,paixu);
            insert(i,x,paixu);
        }
        print(paixu);
    }
    return 0;
}