#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
void pre(int root,const vector<int>& left,const vector<int>& right){
if(root==0){
return;
}
cout<<root<<" ";
pre(left[root],left,right);
pre(right[root],left,right);
}
void in(int root,const vector<int>& left,const vector<int>& right){
if(root==0){
return;
}
in(left[root],left,right);
cout<<root<<" ";
in(right[root],left,right);
}
void post(int root,const vector<int>& left,const vector<int>& right){
if(root==0){
return;
}
post(left[root],left,right);
post(right[root],left,right);
cout<<root<<" ";
}
int main() {
int n;
cin>>n;
vector<int>left(n+1,0),right(n+1,0);
vector<vector<int>>tree(n+1);
vector<bool>parent(n+1,false);
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
tree[a].push_back(b);
parent[b]=true;
}
int root;
// 为每个父节点分配左右孩子
for(int i = 1; i <= n; i++) {
if(tree[i].size() == 1) {
// 只有一个孩子
if(tree[i][0] > i) {
left[i] = tree[i][0]; // 子节点编号大于父节点,视为左孩子
} else {
right[i] = tree[i][0]; // 否则视为右孩子
}
} else if(tree[i].size() == 2) {
// 有两个孩子,按编号排序
sort(tree[i].begin(), tree[i].end());
left[i] = tree[i][0]; // 编号较小者为左孩子
right[i] = tree[i][1]; // 编号较大者为右孩子
}
if(!parent[i]){
root=i;
}
}
pre(root, left, right);
cout<<endl;
in(root, left, right);
cout<<endl;
post(root, left, right);
return 0;
}