#include <bits/stdc++.h>
using namespace std;
const double INF = 1e20, EPS = 1e-9, PI = acos((double)-1);
const double eps = 1e-12;
struct P {
  double first, second;
  int id;
  double ang;
  P() {}
  P(double first, double second) : first(first), second(second) {}
  P operator+(P p) { return P(first + p.first, second + p.second); }
  P operator-(P p) { return P(first - p.first, second - p.second); }
  P operator*(double k) { return P(first * k, second * k); }
  double operator^(P p) { return first * p.second - second * p.first; }
  double operator*(P p) { return first * p.first + second * p.second; }
  P rot(double the) {
    double s = sin(the), c = cos(the);
    return P(first * c - second * s, first * s + second * c);
  }
  P rot() { return P(-second, first); }
  void eat() { cin >> first >> second; }
  double mag() { return sqrt(first * first + second * second); }
  double mag2() { return (first * first + second * second); }
  bool operator<(const P &p) const {
    if ((fabs((first) - (p.first)) < EPS)) return ((second) < (p.second) - EPS);
    return ((first) < (p.first) - EPS);
  }
  bool operator==(const P &p) const {
    return (fabs((first) - (p.first)) < EPS) &&
           (fabs((second) - (p.second)) < EPS);
  }
  P nor() {
    if ((fabs((mag()) - (0)) < EPS)) return *this;
    return *this * (1. / mag());
  }
  P ref(P n) {
    n = n.nor();
    return n * (n * (*this)) * 2 - *this;
  }
};
const int N = 2036;
vector<int> adj[N];
int sz[N];
void ae(int first, int second) {
  adj[first].push_back(second);
  adj[second].push_back(first);
}
void go(int first, int f) {
  sz[first] = 1;
  for (__typeof((adj[first]).begin()) it = (adj[first]).begin();
       it != (adj[first]).end(); it++) {
    if (*it != f) {
      go(*it, first);
      sz[first] += sz[*it];
    }
  }
}
int n;
P p[N];
int ans[N];
bool cmp(const P &a, const P &b) { return ((a.ang) < (b.ang) - EPS); }
void solve(P *p, int np, int root, int f) {
  int idx = 0;
  for (int i = (1); i < (int)(np); i++)
    if (p[i] < p[idx]) idx = i;
  swap(p[idx], p[0]);
  for (int i = (1); i < (int)(np); i++) {
    P dif = p[i] - p[0];
    p[i].ang = atan2(dif.second, dif.first);
  }
  sort(p + 1, p + np, cmp);
  ans[p[0].id] = root + 1;
  int st = 1;
  for (__typeof((adj[root]).begin()) it = (adj[root]).begin();
       it != (adj[root]).end(); it++) {
    int second = *it;
    if (second == f) continue;
    solve(p + st, sz[second], second, root);
    st += sz[second];
  }
}
int main() {
  cin >> n;
  for (int i = (0); i < (int)(n - 1); i++) {
    int first, second;
    cin >> first >> second;
    ae(first - 1, second - 1);
  }
  go(0, -1);
  for (int i = (0); i < (int)(n); i++) {
    p[i].eat();
    p[i].id = i;
  }
  solve(p, n, 0, -1);
  for (int i = (0); i < (int)(n); i++) {
    cout << ans[i];
    if (i == n - 1)
      cout << endl;
    else
      cout << " ";
  }
  return 0;
}
