#include <bits/stdc++.h>
using namespace std;
const int N = int(2e3) + 500;
map<int, vector<int> > mp1, mp2;
vector<pair<pair<int, int>, pair<int, int> > > a, b, ans;
int g[N][N], mx[N], my[N], bo[N], c[N], d[N];
int x[N], y[N];
int n;
void print(pair<pair<int, int>, pair<int, int> > a) {
  cout << a.first.first << ' ' << a.first.second << ' ' << a.second.first << ' '
       << a.second.second << endl;
}
bool intersect(pair<pair<int, int>, pair<int, int> > a,
               pair<pair<int, int>, pair<int, int> > b) {
  return a.first.second < b.first.second && b.first.second < a.second.second &&
         b.first.first < a.first.first && a.first.first < b.second.first;
}
bool find(int x) {
  for (int i = 0; i < b.size(); i++)
    if (g[x][i]) {
      int u = i;
      if (!bo[u]) {
        bo[u] = 1;
        if (my[u] == -1 || find(my[u])) {
          my[u] = x;
          mx[x] = u;
          return 1;
        }
      }
    }
  return 0;
}
void find2(int x) {
  d[x] = 1;
  for (int i = 0; i < a.size(); i++)
    if (mx[i] != -1 && mx[i] != x && !bo[i] && g[i][x] == 1) {
      bo[i] = 1;
      c[i] = 1;
      find2(mx[i]);
    }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &x[i], &y[i]);
    mp1[x[i]].push_back(y[i]);
    mp2[y[i]].push_back(x[i]);
  }
  for (auto &i : mp1) {
    sort(i.second.begin(), i.second.end());
    for (int j = 0; j < i.second.size() - 1; j++)
      a.push_back(make_pair(make_pair(i.first, i.second[j]),
                            make_pair(i.first, i.second[j + 1])));
  }
  for (auto &i : mp2) {
    sort(i.second.begin(), i.second.end());
    for (int j = 0; j < i.second.size() - 1; j++)
      b.push_back(make_pair(make_pair(i.second[j], i.first),
                            make_pair(i.second[j + 1], i.first)));
  }
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < b.size(); j++)
      if (intersect(a[i], b[j])) g[i][j] = 1;
  }
  memset(my, -1, sizeof(my));
  memset(mx, -1, sizeof(mx));
  for (int i = 0; i < a.size(); i++) {
    memset(bo, 0, sizeof(bo));
    find(i);
  }
  memset(bo, 0, sizeof(bo));
  for (int i = 0; i < b.size(); i++)
    if (my[i] == -1) find2(i);
  int p = 0;
  for (auto &i : mp2) {
    int l = i.second[0];
    for (int j = 0; j < i.second.size() - 1; j++)
      if (d[p++] == 0)
        ans.push_back(
            make_pair(make_pair(l, i.first), make_pair(i.second[j], i.first))),
            l = i.second[j + 1];
    ans.push_back(make_pair(make_pair(l, i.first),
                            make_pair(i.second[i.second.size() - 1], i.first)));
  }
  printf("%d\n", ans.size());
  for (auto &i : ans)
    printf("%d %d %d %d\n", i.first.first, i.first.second, i.second.first,
           i.second.second);
  p = 0;
  ans.clear();
  for (auto &i : mp1) {
    int l = i.second[0];
    for (int j = 0; j < i.second.size() - 1; j++)
      if (c[p++])
        ans.push_back(
            make_pair(make_pair(i.first, l), make_pair(i.first, i.second[j]))),
            l = i.second[j + 1];
    ans.push_back(make_pair(make_pair(i.first, l),
                            make_pair(i.first, i.second[i.second.size() - 1])));
  }
  printf("%d\n", ans.size());
  for (auto &i : ans)
    printf("%d %d %d %d\n", i.first.first, i.first.second, i.second.first,
           i.second.second);
  return 0;
}
