#include <bits/stdc++.h>
using namespace std;
template <typename T>
void partition(T array[], int& ll, int& rr, int mid) {
  assert(ll <= mid && mid <= rr);
  const T pivot = array[mid];
  for (;;) {
    while (array[ll] < pivot) ll++;
    while (array[rr] > pivot) rr--;
    if (ll < rr) {
      swap(array[ll++], array[rr--]);
    } else {
      break;
    }
  }
}
template <typename T>
void myqsort(T array[], int ll, int rr) {
  if (ll < rr) {
    int a = ll, b = rr;
    partition(array, a, b, (ll + rr) / 2);
    if (a == b) {
      myqsort(array, ll, a - 1);
      myqsort(array, b + 1, rr);
    } else {
      assert(b + 1 == a);
      assert(ll <= b);
      myqsort(array, ll, b);
      assert(a <= rr);
      myqsort(array, a, rr);
    }
  }
}
void solve(vector<pair<int, int> >& all, int ll, int rr) {
  if (ll >= rr) return;
  int x = all[(ll + rr) >> 1].first;
  for (int i = ll; i <= rr; i++) {
    all.push_back(pair<int, int>(x, all[i].second));
  }
  int mid = (ll + rr) >> 1;
  solve(all, ll, mid - 1);
  solve(all, mid + 1, rr);
}
int main() {
  int n;
  cin >> n;
  vector<pair<int, int> > all(n);
  for (int i = 0; i < (n); ++i) cin >> all[i].first >> all[i].second;
  myqsort(&all[0], 0, n - 1);
  for (int i = 0; i < (n - 1); ++i) assert(all[i] <= all[i + 1]);
  solve(all, 0, n - 1);
  myqsort(&all[0], 0, all.size() - 1);
  all.erase(unique((all).begin(), (all).end()), all.end());
  cout << all.size() << endl;
  for (int i = 0; i < (((int)(all).size())); ++i) {
    cout << all[i].first << " " << all[i].second << endl;
  }
  return 0;
}
