#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int data;
int tag;
struct node *lchild,*rchild;
}treenode;
typedef struct{
treenode *base;
treenode *top;
}mystack;
void init(mystack &m){
m.base=new treenode[100];
m.top=m.base;
}
void push(mystack &m,treenode x){
*m.top++=x;
}
void pop(mystack &m){
m.top--;
}
treenode* gettop(mystack m){
return (m.top-1);
}
int cretree(treenode* &root){
int x;
cin>>x;
if(x==0) root=NULL;
else{
root=new treenode;
root->data=x;
cretree(root->lchild);
cretree(root->rchild);
}
return 0;
}//1 2 3 0 0 4 5 0 6 0 0 7 0 0 0
int visit(treenode *root){
if(root==NULL) return 0;
visit(root->lchild);
visit(root->rchild);
cout<<root->data<<" ";
return 0;
}
int main()
{
mystack m;
init(m);
treenode *root,*p;
cretree(root);
p=root;
while(p!=NULL||m.top!=m.base){
if(p){
push(m,*p);
p->tag=0;
p=p->lchild;
}else{
treenode* q=gettop(m);
if(q->tag==0){
q->tag=1;
p=q->rchild;
}else if(q->tag==1){
pop(m);
cout<<q->data<<" ";
}
}
}
cout<<endl;
visit(root);
return 0;
}