#include using namespace std; #define SZ(x) ((int)(x).size()) struct point { int x, y, i; void read(int z) { scanf("%d%d", &x, &y); i = z; } point operator-(const point& p) const { return {p.x - x, p.y - y}; } bool operator<(const point& rhs) const { if(x != rhs.x) { return x < rhs.x; } else { return y < rhs.y; } } }; int n; vector P; long long cross(point a, point b) { return 1LL*a.x*b.y - 1LL*a.y*b.x; } int main() { int foo, bar; scanf("%d", &n); for(int i = 0; i < n - 1; i++) scanf("%d%d", &foo, &bar); P.resize(n); for(int i = 0; i < n; i++) P[i].read(i); sort(P.begin(), P.end()); for(int i = 0; i + 1 < n; i++) { printf("%d %d\n", P[i].i, P[i+1].i); } return 0; int j = 0; for(int i = 0; i < SZ(P); i++) { if(P[i].y < P[j].y || (P[i].y == P[j].y && P[i].x > P[j].x)) { j = i; } } point a = P[j]; P.erase(P.begin() + j); while(!P.empty()) { j = 0; for(int i = 1; i < SZ(P); i++) { point vi = P[i]-a; point vj = P[j]-a; if(cross(vi, vj) > 0) { j = i; } } printf("%d %d\n", a.i, P[j].i); a = P[j]; P.erase(P.begin() + j); } }