#include <bits/stdc++.h>
using namespace std;
const int N = 1500;
int n;
vector<int> g[N + 1];
int parent[N + 1], subtreeSize[N + 1], vertex[N + 1];
struct Point {
  int x, y, i;
  Point() : x(0), y(0), i(0) {}
  Point(int coord1, int coord2) : x(coord1), y(coord2), i(0) {}
  Point(int coord1, int coord2, int index) : x(coord1), y(coord2), i(index) {}
  void read() {
    static int counter = 0;
    cin >> x >> y;
    i = ++counter;
  }
  Point subPoint(const Point &a) const { return Point(x - a.x, y - a.y); }
  int order() const {
    if (x) {
      if (x > 0) {
        return 1;
      } else {
        return 3;
      }
    } else {
      if (y > 0) {
        return 2;
      } else {
        return 0;
      }
    }
  }
  int order(const Point &a) const {
    if (order() != a.order()) {
      return (order() + 4 - a.order()) % 4;
    } else {
      if ((long long)y * a.x < (long long)x * a.y) {
        return 4;
      } else {
        return 0;
      }
    }
  }
};
Point points[N + 1];
Point operator-(const Point &a, const Point &b) {
  return Point(a.x - b.x, a.y - b.y);
}
Point center, beginning;
bool compareAngles(const Point &a, const Point &b) {
  Point sa = a.subPoint(center);
  Point sb = b.subPoint(center);
  if (sa.order(beginning - center) != sb.order(beginning - center)) {
    return (sa.order(beginning - center) < sb.order(beginning - center));
  }
  return ((long long)sa.y * sb.x < (long long)sa.x * sb.y);
}
bool compareIndexes(const Point &a, const Point &b) { return (a.i < b.i); }
void drawTree(const int v, const int b, const int e, const Point &prevPoint) {
  vertex[points[b].i] = v;
  center = points[b];
  beginning = prevPoint;
  sort(points + b + 1, points + e + 1, compareAngles);
  int i = b;
  for (int c : g[v]) {
    if (c == parent[v]) {
      continue;
    }
    drawTree(c, i + 1, i + subtreeSize[c], points[b]);
    i += subtreeSize[c];
  }
}
void dfs(int v, int p) {
  parent[v] = p;
  for (int c : g[v]) {
    if (c == p) continue;
    dfs(c, v);
    subtreeSize[v] += subtreeSize[c];
  }
  ++subtreeSize[v];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i < n; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; ++i) {
    points[i].read();
  }
  dfs(1, 0);
  int minX = points[0].x, minI = 0;
  for (int i = 1; i < n; ++i) {
    if (points[i].x < minX) {
      minX = points[i].x;
      minI = i;
    }
  }
  swap(points[0], points[minI]);
  drawTree(1, 0, n - 1, Point(points[0].x - 1, points[0].y));
  for (int i = 1; i <= n; ++i) {
    cout << vertex[i] << ' ';
  }
  return 0;
}
