#include <bits/stdc++.h>
using namespace std;
struct point {
  long long x, y;
  bool operator<(const point& t) const {
    if (x == t.x) return y < t.y;
    return x < t.x;
  }
  bool operator==(const point& t) const { return x == t.x && y == t.y; }
};
const long long INF = 1e18;
const long long mod = 1e9 + 7;
const long long MAXN = 1e6 + 69;
long long q = 1, m, n, x, y, z, k, l;
point a[MAXN];
string s;
set<point> ans;
vector<point> X;
vector<point> solve(const vector<point>& X) {
  if (X.size() <= 1) return X;
  long long mid = X.size() / 2;
  vector<point> a, b;
  for (long long i = 0; i < mid; i++) {
    a.push_back(X[i]);
  }
  for (long long i = mid; i < X.size(); i++) {
    b.push_back(X[i]);
  }
  a = solve(a);
  b = solve(b);
  long long middle = (a.back().x + b[0].x) / 2;
  vector<point> res;
  for (long long i = 0; i < a.size(); i++) {
    res.push_back(a[i]);
    res.push_back({middle, a[i].y});
  }
  for (long long i = 0; i < b.size(); i++) {
    res.push_back(b[i]);
    res.push_back({middle, b[i].y});
  }
  sort(res.begin(), res.end());
  res.resize(unique(res.begin(), res.end()) - res.begin());
  return res;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (long long i = 1; i <= n; i++)
    cin >> a[i].x >> a[i].y, ans.insert({a[i]});
  sort(a + 1, a + n + 1);
  for (long long i = 1; i <= n; i++) X.push_back(a[i]);
  vector<point> ans = solve(X);
  cout << ans.size() << '\n';
  for (point u : ans) cout << u.x << ' ' << u.y << '\n';
}
