#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
struct PP {
  int x, y;
  bool operator<(const PP& th) const { return x != th.x ? x < th.x : y < th.y; }
  bool operator==(const PP& th) const { return x == th.x && y == th.y; }
} pp[N];
PP sta[N * 2];
int top;
int vis[N], mp[N];
void dfs(int l, int r) {
  if (l == r) return;
  int mid = (l + r) / 2;
  for (int i = l; i <= r; i++)
    if (!vis[pp[i].y]) {
      vis[pp[i].y] = 1;
      sta[top].x = pp[mid].x;
      sta[top].y = mp[pp[i].y];
      top++;
    }
  for (int i = l; i <= r; i++) vis[pp[i].y] = 0;
  if (l <= mid - 1) dfs(l, mid - 1);
  if (r >= mid + 1) dfs(mid + 1, r);
}
int main() {
  int n;
  while (scanf("%d", &n) != EOF) {
    top = 0;
    for (int i = 0; i < n; i++) {
      scanf("%d%d", &pp[i].x, &pp[i].y);
      mp[top++] = pp[i].y;
      sta[i].x = pp[i].x;
      sta[i].y = pp[i].y;
    }
    sort(mp, mp + top);
    top = unique(mp, mp + top) - mp;
    for (int i = 0; i < n; i++)
      pp[i].y = lower_bound(mp, mp + top, pp[i].y) - mp;
    sort(pp, pp + n);
    memset(vis, 0, sizeof(vis));
    top = n;
    dfs(0, n - 1);
    sort(sta, sta + top);
    top = unique(sta, sta + top) - sta;
    printf("%d\n", top);
    for (int i = 0; i < top; i++) {
      printf("%d %d\n", sta[i].x, sta[i].y);
    }
  }
  return 0;
}
