#include <bits/stdc++.h>   using namespace std;   int X[1 << 11];   int Y[1 << 11];   int B[1 << 11];   int NX[1 << 11];   int NY[1 << 11];   int E[1 << 11][1 << 11];   int gN;   int dfs(int a) {     if (a == gN - 1) return 1;     B[a] = 1;     int i;     for (i = (0); i < (gN); ++i)       if (B[i] == 0 && E[a][i] > 0 && dfs(i) != 0) {         --E[a][i];         ++E[i][a];         return 1;       }     return 0;   }   void fwd(int a) {     B[a] = 1;     int i;     for (i = (0); i < (gN); ++i)       if (B[i] == 0 && E[a][i] > 0) fwd(i);   }   void bwd(int a) {     B[a] = 1;     int i;     for (i = (0); i < (gN); ++i)       if (B[i] == 0 && E[i][a] > 0) bwd(i);   }   int main() {     int n;     scanf( %d , &n);     int i, j;     for (i = (0); i < (n); ++i) scanf( %d%d , &X[i], &Y[i]);     vector<pair<pair<int, int>, int>> vx(n), vy(n);     for (i = (0); i < (n); ++i) {       vx[i] = make_pair(pair<int, int>(X[i], Y[i]), i);       vy[i] = make_pair(pair<int, int>(Y[i], X[i]), i);     }     sort((vx).begin(), (vx).end());     sort((vy).begin(), (vy).end());     vector<pair<int, int>> x, y;     for (i = (1); i < (n); ++i)       if (vx[i].first.first == vx[i - 1].first.first)         x.push_back(pair<int, int>(vx[i - 1].second, vx[i].second));     for (i = (1); i < (n); ++i)       if (vy[i].first.first == vy[i - 1].first.first)         y.push_back(pair<int, int>(vy[i - 1].second, vy[i].second));     int nx = int((x).size());     int ny = int((y).size());     memset(NX, -1, sizeof(NX));     memset(NY, -1, sizeof(NY));     for (i = (0); i < (nx); ++i) NX[x[i].first] = x[i].second;     for (i = (0); i < (ny); ++i) NY[y[i].first] = y[i].second;     memset(E, 0, sizeof(E));     for (i = (0); i < (nx); ++i)       for (j = (0); j < (ny); ++j) {         int ax = x[i].first;         int bx = x[i].second;         int ay = y[j].first;         int by = y[j].second;         if (Y[ay] <= Y[ax] || Y[bx] <= Y[ay]) continue;         if (X[ax] <= X[ay] || X[by] <= X[ax]) continue;         E[i][nx + j] = 1;       }     for (i = (0); i < (nx); ++i) E[nx + ny][i] = 1;     for (i = (0); i < (ny); ++i) E[i + nx][nx + ny + 1] = 1;     gN = nx + ny + 2;     int flow = 0;     for (i = (0); i < (nx); ++i)       for (j = (0); j < (ny); ++j)         if (E[gN - 2][i] > 0 && E[i][nx + j] > 0 && E[nx + j][gN - 1] > 0) {           --E[gN - 2][i];           ++E[i][gN - 2];           --E[i][nx + j];           ++E[nx + j][i];           --E[nx + j][gN - 1];           ++E[gN - 1][nx + j];           ++flow;         }     while (true) {       memset(B, 0, sizeof(B));       if (dfs(nx + ny) == 0) break;       ++flow;     }     for (i = (0); i < (nx); ++i)       if (B[i] == 0) {         int a = x[i].first;         int b = x[i].second;         NX[a] = -1;       }     for (i = (0); i < (ny); ++i)       if (B[nx + i] != 0) {         int a = y[i].first;         int b = y[i].second;         NY[a] = -1;       }     memset(B, 0, sizeof(B));     vector<pair<pair<int, int>, pair<int, int>>> rx;     for (i = (0); i < (int((vx).size())); ++i) {       int a = vx[i].second;       if (B[a] != 0) continue;       B[a] = 1;       int b = a;       while (NX[b] != -1) {         b = NX[b];         B[b] = 1;       }       if (X[a] != X[b]) throw 0;       rx.push_back(           make_pair(pair<int, int>(X[a], Y[a]), pair<int, int>(X[b], Y[b])));     }     memset(B, 0, sizeof(B));     vector<pair<pair<int, int>, pair<int, int>>> ry;     for (i = (0); i < (int((vy).size())); ++i) {       int a = vy[i].second;       if (B[a] != 0) continue;       B[a] = 1;       int b = a;       while (NY[b] != -1) {         b = NY[b];         B[b] = 1;       }       if (Y[a] != Y[b]) throw 0;       ry.push_back(           make_pair(pair<int, int>(X[a], Y[a]), pair<int, int>(X[b], Y[b])));     }     if (int((rx).size()) + int((ry).size()) != 2 * n - (nx + ny - flow)) throw 0;     printf( %d n , int((ry).size()));     for (i = (0); i < (int((ry).size())); ++i)       printf( %d %d %d %d n , ry[i].first.first, ry[i].first.second,              ry[i].second.first, ry[i].second.second);     printf( %d n , int((rx).size()));     for (i = (0); i < (int((rx).size())); ++i)       printf( %d %d %d %d n , rx[i].first.first, rx[i].first.second,              rx[i].second.first, rx[i].second.second);     return 0;   };