#include <bits/stdc++.h>   using namespace std;   const int M = 1500 + 10;   int n, x, y;   struct node {     int xx, yy, id;     bool operator<(const node &a) const {       if (xx - x >= 0 && a.xx - x <= 0) return 1;       if (xx - x <= 0 && a.xx - x >= 0) return 0;       return (yy - y) * (long long)(a.xx - x) < (a.yy - y) * (long long)(xx - x);     }   } p[M];   vector<int> g[M];   int sz[M];   int ans[M];   void dfs(int o, int u) {     sz[u] = 1;     for (int &v : g[u])       if (v != o) {         dfs(u, v);         sz[u] += sz[v];       }   }   void dfs2(int o, int u, int l, int r) {     if (sz[u] == 1) {       ans[p[l].id] = u;       return;     }     int id = l;     for (int i = l + 1; i < r; ++i) {       if (p[i].xx < p[id].xx) {         id = i;       }     }     swap(p[id], p[l]);     ans[p[l].id] = u;     x = p[l].xx, y = p[l].yy;     sort(p + l + 1, p + r);     int sum = l + 1;     for (int &v : g[u])       if (v != o) {         dfs2(u, v, sum, sum + sz[v]);         sum += sz[v];       }   }   int main() {     scanf( %d , &n);     for (int i = 1, u, v; i < n; ++i) {       scanf( %d%d , &u, &v);       g[u].emplace_back(v);       g[v].emplace_back(u);     }     for (int i = 0; i < n; ++i) {       scanf( %d%d , &p[i].xx, &p[i].yy);       p[i].id = i;     }     dfs(1, 1);     dfs2(1, 1, 0, n);     for (int i = 0; i < n; ++i) {       printf( %d%c , ans[i],    n [i == n - 1]);     }     return 0;   }   