#include using namespace std; #define int long long #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define REP(i,a) FOR(i,0,(a)-1) #define PB push_back #define EB emplace_back #define ALL(a) (a).begin(),(a).end() #define ST first #define ND second #define SIZE(a) (int)(a).size() typedef pair PII; typedef vector VI; typedef vector VII; VI v[1003]; int siz[1003], parent[1003]; PII wsp[1003]; void dfs(int a) { siz[a] = 1; for (int b : v[a]) { if (b != parent[a]) { parent[b] = a; dfs(b); siz[a] += siz[b]; } } } void sortuj(VII& w) { REP(i, SIZE(w)) { if (w[i] < w.back()) { swap(w[i], w.back()); } } auto smal = w.back(); w.pop_back(); sort(w.begin(), w.end(), [&](const PII& a, const PII& b) { int ax = a.ST - smal.ST; int ay = a.ND - smal.ND; int bx = b.ST - smal.ST; int by = b.ND - smal.ND; return ax * by < ay * bx; }); w.PB(smal); return; } void solve(VII dupsko, int node) { sortuj(dupsko); wsp[node] = dupsko.back(); dupsko.pop_back(); for (int a : v[node]) if (a != parent[node]) { int ile = siz[a]; VII bla; while(ile--) { bla.PB(dupsko.back()); dupsko.pop_back(); } solve(bla, a); } } #undef int int main() { int n; cin >> n; VII edges; map punkt; VII dupsko; REP(i, n - 1) { int a, b; cin >> a >> b; v[a].PB(b); v[b].PB(a); edges.EB(a, b); } dfs(0); REP(i,n) { int x, y; cin >> x >> y; punkt[{x, y}] = i; dupsko.EB(x, y); } solve(dupsko, 0); for (auto e : edges) { cout << punkt[wsp[e.ST]] << " " << punkt[wsp[e.ND]] << "\n"; } return 0; }