#include <bits/stdc++.h>
using namespace std;
;
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const long long INFLL = 0x3f3f3f3f3f3f3f3f;
struct EDGE {
  int v, nxt;
} edge[maxn << 1];
int head[maxn], tot;
void add_edge(int u, int v) {
  edge[tot].v = v, edge[tot].nxt = head[u], head[u] = tot++;
}
long long bit[maxn];
int lowbit(int x) { return x & (-x); }
void add(int pos, int val) {
  while (pos < maxn) {
    bit[pos] += val, pos += lowbit(pos);
  }
}
long long sum(int pos) {
  long long ans = 0;
  while (pos) {
    ans += bit[pos], pos -= lowbit(pos);
  }
  return ans;
}
pair<int, int> p[maxn];
set<pair<int, int> > s;
void dfs(int l, int r) {
  int mid = (l + r) >> 1;
  for (int i = l; i <= r; i++) {
    s.insert(make_pair(p[mid].first, p[i].second));
  }
  if (l < mid) dfs(l, mid - 1);
  if (r > mid) dfs(mid + 1, r);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    cin >> p[i].first >> p[i].second;
  }
  sort(p, p + n);
  dfs(0, n - 1);
  cout << s.size() << endl;
  set<pair<int, int> >::iterator it;
  for (it = s.begin(); it != s.end(); it++)
    cout << it->first << ' ' << it->second << endl;
  return 0;
}
