#include <bits/stdc++.h>
using namespace std;
int n, nx, ny, sl, fh, ansx, ansy, x[1010], y[1010], xs[1010], ys[1010],
    cx[1010], cy[1010], rkx[1010], rky[1010];
int num, szx[1010], szy[1010], px[1010][1010], py[1010][1010], idx[1010][1010],
    idy[1010][1010];
int vx[1010], vy[1010];
int t, h[1010 << 1];
struct edge {
  int to, nxt;
} e[1010 * 1010];
bool cmpx(const int &a, const int &b) {
  return x[a] < x[b] || (x[a] == x[b] && y[a] < y[b]);
}
bool cmpy(const int &a, const int &b) {
  return y[a] < y[b] || (y[a] == y[b] && x[a] < x[b]);
}
int rd() {
  sl = 0;
  fh = 1;
  char ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') sl = sl * 10 + ch - '0', ch = getchar();
  return sl * fh;
}
void add(int u, int v) {
  if (u && v) e[++t] = (edge){v, h[u]}, h[u] = t;
}
bool dfs(int u) {
  vx[u] = 1;
  int v;
  for (int i = h[u]; i; i = e[i].nxt)
    if (!vy[v = e[i].to]) {
      vy[v] = 1;
      if (!cy[v] || dfs(cy[v])) {
        cx[cy[v] = u] = v;
        return 1;
      }
    }
  return 0;
}
int main() {
  n = rd();
  for (int i = 1; i <= n; ++i) {
    xs[i] = x[i] = rd();
    ys[i] = y[i] = rd();
  }
  sort(xs + 1, xs + n + 1);
  nx = unique(xs + 1, xs + n + 1) - xs - 1;
  sort(ys + 1, ys + n + 1);
  ny = unique(ys + 1, ys + n + 1) - ys - 1;
  ansx = nx;
  ansy = ny;
  for (int i = 1; i <= n; ++i) {
    x[i] = lower_bound(xs + 1, xs + nx + 1, x[i]) - xs;
    y[i] = lower_bound(ys + 1, ys + ny + 1, y[i]) - ys;
    px[x[i]][++szx[x[i]]] = y[i];
    py[y[i]][++szy[y[i]]] = x[i];
  }
  nx = ny = 0;
  for (int y, i = 1; i <= ansx; ++i) {
    sort(px[i] + 1, px[i] + szx[i] + 1);
    for (int j = 2; j <= szx[i]; ++j)
      if ((y = px[i][j - 1] + 1) != px[i][j])
        for (nx++; y < px[i][j]; ++y) idx[i][y] = nx;
  }
  for (int x, i = 1; i <= ansy; ++i) {
    sort(py[i] + 1, py[i] + szy[i] + 1);
    for (int j = 2; j <= szy[i]; ++j)
      if ((x = py[i][j - 1] + 1) != py[i][j])
        for (ny++; x < py[i][j]; ++x) idy[x][i] = ny;
  }
  for (int i = 1; i <= ansx; ++i)
    for (int j = 1; j <= ansy; ++j) add(idx[i][j], idy[i][j]);
  for (int i = 1; i <= nx; ++i) {
    memset(vx + 1, 0, sizeof(int) * nx);
    memset(vy + 1, 0, sizeof(int) * ny);
    dfs(i);
  }
  memset(vx + 1, 0, sizeof(int) * nx);
  memset(vy + 1, 0, sizeof(int) * ny);
  for (int i = 1; i <= nx; ++i)
    if (!cx[i]) dfs(i);
  for (int i = 1; i <= nx; ++i)
    if (!vx[i]) ansx++;
  for (int i = 1; i <= ny; ++i)
    if (vy[i]) ansy++;
  printf("%d\n", ansy);
  for (int i = 1; ys[i - 1] < ys[i]; ++i)
    for (int k, j = 1; j <= szy[i]; j = k + 1) {
      for (k = j; k + 1 <= szy[i]; ++k)
        if (py[i][k] + 1 != py[i][k + 1] && vy[idy[py[i][k] + 1][i]]) break;
      printf("%d %d %d %d\n", xs[py[i][j]], ys[i], xs[py[i][k]], ys[i]);
    }
  printf("%d\n", ansx);
  for (int i = 1; xs[i - 1] < xs[i]; ++i)
    for (int k, j = 1; j <= szx[i]; j = k + 1) {
      for (k = j; k + 1 <= szx[i]; ++k)
        if (px[i][k] + 1 != px[i][k + 1] && !vx[idx[i][px[i][k] + 1]]) break;
      printf("%d %d %d %d\n", xs[i], ys[px[i][j]], xs[i], ys[px[i][k]]);
    }
  return 0;
}
