#include<cstdio>
using namespace std;
const int maxn=105;
int n;
struct Node///建立结点,用结构体加指针,v表示结点的值
{
    int v;
    Node *left,*right;///用指针指向左子树和右子树
    Node():left(NULL),right(NULL) {}///创建新结点
} tree ;
Node* root;///定义根结点

Node *newnode()
{
    return new Node();   ///申请新结点
}

Node* Create(Node *rt,int v)///建立树,需要传入根结点和需要建立的值
{
    if(rt==NULL)///如果结点为空,则将值赋给结点
    {
        rt=newnode();///新结点
        rt->v=v;///结点赋值
        rt->left=rt->right=NULL;///左右子树为空
        return rt;///返回结点
    }
    if(rt->v<v)///当输入值大于父节点时,使用递归方法将其建立为右子树
        rt->right=Create(rt->right,v);
    else///当输入值小于父节点时,使用递归方法将其建立为左子树
        rt->left=Create(rt->left,v);
    return rt;
}

void PreOrder(Node *rt,int v) ///先序遍历,并且输出
{
    if(v==1)
        printf("%d",rt->v);
    else
        printf(" %d",rt->v);
    if(rt->left!=NULL)
        PreOrder(rt->left,v+1);///递归调用
    if(rt->right!=NULL)
        PreOrder(rt->right,v+1);
}

int main()
{
    while(~scanf("%d",&n)&&n)
    {
        root=NULL;///初始化根结点
        int v;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&v);
            root=Create(root,v);///边输入边建立树
        }
        PreOrder(root,1);///先序遍历
        printf("\n");
    }
    return 0;
}