#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
const int maxn=110;
int n;
int bt[maxn];
int temp[maxn];
int k=0;
int p=0;
struct Node
{
int lchild;
int rchild;
int data;
}node[maxn];
void inorder(int index)
{
if(index==-1)
return;
inorder(node[index].lchild);
node[index].data=temp[k++];
inorder(node[index].rchild);
}
void levelorder(int root)
{
queue<Node> q;
q.push(node[root]);
while(!q.empty())
{
Node top=q.front();
q.pop();
bt[p++]=top.data;
if(top.lchild!=-1)
q.push(node[top.lchild]);
if(top.rchild!=-1)
q.push(node[top.rchild]);
}
}
int main()
{
int lchild,rchild;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&lchild,&rchild);
node[i].lchild=lchild;
node[i].rchild=rchild;
}
for(int i=0;i<n;i++)
{
scanf("%d",&temp[i]);
}
sort(temp,temp+n);
inorder(0);
levelorder(0);
for(int i=0;i<n;i++)
{
printf("%d",bt[i]);
if(i<n-1)
printf(" ");
}
system("pause");
return 0;
}