#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y;
} A[100010], ans[1000010], print[1000010];
int n, counter, total;
bool compare(node a, node b) {
  if (a.x == b.x) {
    return a.y < b.y;
  }
  return a.x < b.x;
}
void func(int l, int r) {
  if (l == r) {
    ans[++counter] = A[l];
  }
  if (l >= r) {
    return;
  }
  int middle = (l + r) / 2;
  func(l, middle - 1);
  func(middle + 1, r);
  for (int i = l; i <= r; i++) {
    node temp;
    temp.x = A[middle].x;
    temp.y = A[i].y;
    ans[++counter] = temp;
  }
}
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 + 1 + n, compare);
  func(1, n);
  sort(ans + 1, ans + 1 + counter, compare);
  print[++total] = ans[1];
  for (int i = 2; i <= counter; i++) {
    if (ans[i].x != ans[i - 1].x || ans[i].y != ans[i - 1].y) {
      print[++total] = ans[i];
    }
  }
  printf("%d\n", total);
  for (int i = 1; i <= total; i++) {
    printf("%d %d\n", print[i].x, print[i].y);
  }
  return 0;
}
