#include <iostream>
#include <vector>

using namespace std;

struct Node {
	int left;
	int right;
};

int n;
bool in_degree[100005];

void pre_order(int root, vector<Node>& tree) {
	if (!root) return;
	cout << root << " ";
	pre_order(tree[root].left, tree);
	pre_order(tree[root].right, tree);
}
void in_order(int root, vector<Node>& tree) {
	if (!root) return;
	in_order(tree[root].left, tree);
	cout << root << " ";
	in_order(tree[root].right, tree);
}
void post_order(int root, vector<Node>& tree) {
	if (!root) return;
	post_order(tree[root].left, tree);
	post_order(tree[root].right, tree);
	cout << root << " ";
}

//不知道有没有什么更好的方式存储树的信息
int main() {
	cin >> n;
	vector<Node> tree(n + 1);
	int v1, v2;
	for (int i = 0; i < n - 1; i++) {
		cin >> v1 >> v2;
		in_degree[v2] = true;
		int subling = max(tree[v1].left, tree[v1].right);
		if (subling) {
			int left, right;
			right = max(subling, v2);
			left = min(subling, v2);			 
			tree[v1].left = left;
			tree[v1].right = right;
		} else {
			if (v1 > v2) tree[v1].right = v2;
			else tree[v1].left = v2;
		}
	}
	int root;
	for (int i = 1; i <= n; i++) {
		if(!in_degree[i]) root = i;  
	}
	pre_order(root, tree);
	cout << endl;
	in_order(root, tree);
	cout << endl;
	post_order(root, tree);
	cout << endl;
}