#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int val,left,right;
};
vector<node> v;
vector<int> origin;
int cnt=0;
void inOrder(int index){
if(index==-1) return;
inOrder(v[index].left);
v[index].val=origin[cnt++];
inOrder(v[index].right);
}
void bfs(){
queue<node> q;
q.push(v[0]);
cnt=0;
while(!q.empty()){
node top=q.front();
q.pop();
if(cnt++!=0)
printf(" ");
printf("%d",top.val);
if(top.left!=-1)
q.push(v[top.left]);
if(top.right!=-1)
q.push(v[top.right]);
}
}
int main(){
int N;
scanf("%d",&N);
v.resize(N);
origin.resize(N);
for(int i=0;i<N;i++)
scanf("%d%d",&v[i].left,&v[i].right);
for(int i=0;i<N;i++)
scanf("%d",&origin[i]);
sort(origin.begin(),origin.end());
inOrder(0);
bfs();
}