#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#define maxn 110
using namespace std;
struct node {
int left, right;
};
node child[maxn];
int input[maxn];
int N;
vector<int> index, output;
void inorder(int r) {
if (r == -1) return;
inorder(child[r].left);
index.push_back(r);
inorder(child[r].right);
}
void level_order(int r) {
queue<int> q;
q.push(r);
while(!q.empty()) {
int t = q.front();
q.pop();
output.push_back(t);
if (child[t].left != -1) q.push(child[t].left);
if (child[t].right != -1) q.push(child[t].right);
}
return;
}
int main() {
int a, b;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d %d", &a, &b);
child[i].left = a;
child[i].right = b;
}
for (int i = 0; i < N; i++) {
scanf("%d", &input[i]);
}
sort(input, input + N);
inorder(0);
level_order(0);
for (int i = 0; i < N; i++) {
int j;
for (j = 0; j < N; j++) {
if (index[j] == output[i]) break;
}
printf("%d", input[j]);
if (i != N - 1) printf(" ");
else printf("\n");
}
}