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