#include <bits/stdc++.h>
using namespace std;
int n, la, lb;
struct point {
  int x, y;
} a[200000], b[200000];
bool cprx(point u, point v) { return u.x < v.x || u.x == v.x && u.y < v.y; }
bool cpry(point u, point v) { return u.y < v.y; }
void work(int l, int r) {
  if (l >= r) return;
  int lm = l + r >> 1, rm = lm;
  while (lm > l && a[lm - 1].x == a[lm].x) --lm;
  while (rm < r && a[rm + 1].x == a[rm].x) ++rm;
  lb = 0;
  for (int i = (l); i <= (lm - 1); ++i) b[++lb] = a[i];
  for (int i = (rm + 1); i <= (r); ++i) b[++lb] = a[i];
  sort(b + 1, b + lb + 1, cpry);
  for (int i = 1; i <= (lb); ++i)
    if (i == 1 || b[i].y != b[i - 1].y) a[++la].x = a[lm].x, a[la].y = b[i].y;
  work(l, lm - 1);
  work(rm + 1, r);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= (n); ++i) scanf("%d%d", &a[i].x, &a[i].y);
  sort(a + 1, a + n + 1, cprx);
  la = n;
  work(1, n);
  sort(a + 1, a + la + 1, cprx);
  lb = 0;
  for (int i = 1; i <= (la); ++i)
    if (a[i].x != a[i + 1].x || a[i].y != a[i + 1].y || i == la) b[++lb] = a[i];
  printf("%d\n", lb);
  for (int i = 1; i <= (lb); ++i) printf("%d %d\n", b[i].x, b[i].y);
  return 0;
}
