#include <iostream>
using namespace std;

struct TreeNode
{
    int data;
    TreeNode* leftchild;
    TreeNode* rightchild;
    TreeNode(int x):data(x), leftchild(NULL),rightchild(NULL){}
};

TreeNode* Insert(TreeNode* root,int x)
{
    if(root==NULL)
    {
        root=new TreeNode(x);
    }
    else if(x<root->data)//输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出
    {
        root->leftchild=Insert(root->leftchild,x);
    }
    else if(x>root->data)//等于的那种情况就不插入了
    {
        root->rightchild=Insert(root->rightchild,x);
    }
    return root;
}

void PreOrder(TreeNode* root)
{
    if(root==NULL)return;
    cout<<root->data<<" ";
    PreOrder(root->leftchild);
    PreOrder(root->rightchild);
}

void InOrder(TreeNode* root)
{
    if(root==NULL)return;
    InOrder(root->leftchild);
    cout<<root->data<<" ";
    InOrder(root->rightchild);
}

void PostOrder(TreeNode* root)
{
    if(root==NULL)return;
    PostOrder(root->leftchild);
    PostOrder(root->rightchild);
    cout<<root->data<<" ";
  
}
int main() {
    int n;
    while (cin >>n) { 
        TreeNode* root=NULL;
        for(int i=1;i<=n;i++)
        {
            int x;cin>>x;
            root=Insert(root,x);
        }
        PreOrder(root);cout<<endl;
        InOrder(root);cout<<endl;
        PostOrder(root);cout<<endl;
    }
}