#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}; } }; 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); 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); } }