#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  point() {}
  point(int X, int Y) {
    x = X;
    y = Y;
  }
};
bool operator<(const point &First, const point &Second) {
  if (First.x != Second.x)
    return (First.x < Second.x);
  else
    return (First.y < Second.y);
}
bool Cmp_px(point a, point b) { return (a.x < b.x); }
bool Cmp_py(point a, point b) { return (a.y < b.y); }
set<point> ret;
point rg[10001];
int N, i, j, k;
void Process(int L, int R, char Axis) {
  if (Axis == 'x') {
    sort(rg + L, rg + R + 1, Cmp_px);
    int Mid = (L + R) / 2;
    int LR, RL, Cx = rg[Mid].x;
    int i;
    for (i = L; i <= R; i++) ret.insert(point(Cx, rg[i].y));
    LR = Mid - 1;
    while ((LR >= L) && (rg[LR].x == Cx)) LR--;
    if (L < LR) Process(L, LR, 'y');
    RL = Mid + 1;
    while ((RL <= R) && (rg[RL].x == Cx)) RL++;
    if (RL < R) Process(RL, R, 'y');
  }
  if (Axis == 'y') {
    sort(rg + L, rg + R + 1, Cmp_py);
    int Mid = (L + R) / 2;
    int LR, RL, Cy = rg[Mid].y;
    int i;
    for (i = L; i <= R; i++) ret.insert(point(rg[i].x, Cy));
    LR = Mid - 1;
    while ((LR >= L) && (rg[LR].y == Cy)) LR--;
    if (L < LR) Process(L, LR, 'x');
    RL = Mid + 1;
    while ((RL <= R) && (rg[RL].y == Cy)) RL++;
    if (RL < R) Process(RL, R, 'x');
  }
}
int main() {
  scanf("%d", &N);
  for (i = 1; i <= N; i++) scanf("%d%d", &rg[i].x, &rg[i].y);
  ret.clear();
  for (i = 1; i <= N; i++) ret.insert(point(rg[i].x, rg[i].y));
  Process(1, N, 'x');
  printf("%d\n", ret.size());
  set<point>::iterator p;
  for (p = ret.begin(); p != ret.end(); p++) printf("%d %d\n", p->x, p->y);
}
