#include <bits/stdc++.h>
using namespace std;
bool cmpx(const pair<int, int> &a, const pair<int, int> &b) {
  return a.first < b.first;
}
bool cmpy(const pair<int, int> &a, const pair<int, int> &b) {
  return a.second < b.second;
}
vector<pair<int, int> > pnt;
pair<int, int> p[50100];
int n, x, y;
void partition(int l, int r, int ty) {
  if (l > r) return;
  if (l == r) {
    pnt.push_back(p[l]);
    return;
  }
  if (ty == 0) {
    sort(p + l, p + r + 1, cmpx);
    int xmd = p[(l + r) >> 1].first;
    int tr = l - 1, tl = r + 1;
    for (int i = l; i < r + 1; i++)
      if (p[i].first < xmd) tr = i;
    for (int i = r + 1 - 1; i >= l; i--)
      if (p[i].first > xmd) tl = i;
    for (int i = l; i < r + 1; i++) pnt.push_back(make_pair(xmd, p[i].second));
    partition(l, tr, 1 - ty);
    partition(tl, r, 1 - ty);
  } else {
    sort(p + l, p + r + 1, cmpy);
    int ymd = p[(l + r) >> 1].second;
    int tr = l - 1, tl = r + 1;
    for (int i = l; i < r + 1; i++)
      if (p[i].second < ymd) tr = i;
    for (int i = r + 1 - 1; i >= l; i--)
      if (p[i].second > ymd) tl = i;
    for (int i = l; i < r + 1; i++) pnt.push_back(make_pair(p[i].first, ymd));
    partition(l, tr, 1 - ty);
    partition(tl, r, 1 - ty);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &x, &y);
    p[i] = make_pair(x, y);
  }
  partition(0, n - 1, 0);
  sort(pnt.begin(), pnt.end());
  pnt.erase(unique(pnt.begin(), pnt.end()), pnt.end());
  printf("%d\n", pnt.size());
  for (int i = 0; i < pnt.size(); i++)
    printf("%d %d\n", pnt[i].first, pnt[i].second);
}
