#include <bits/stdc++.h>
using namespace std;
int countbit(int n) { return (n == 0) ? 0 : (1 + countbit(n & (n - 1))); }
int lowbit(int n) { return (n ^ (n - 1)) & n; }
const double pi = acos(-1.0);
const double eps = 1e-11;
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
void checkmin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
void checkmax(T &a, T b) {
  if (b > a) a = b;
}
const int maxsize = 200000 + 5;
int n;
vector<pair<int, int> > a, result;
void solve(vector<pair<int, int> > a) {
  int n = ((int)((a).size()));
  if (n == 0) return;
  set<int> sx, sy;
  for (int i = 0; i < n; i++) {
    sx.insert(a[i].first);
    sy.insert(a[i].second);
  }
  if (((int)((sx).size())) == 1 || ((int)((sy).size())) == 1) {
    for (int i = 0; i < n; i++) result.push_back(a[i]);
    return;
  }
  if (((int)((sx).size())) > ((int)((sy).size()))) {
    int counter = ((int)((sx).size())) / 2, key = -1;
    for (set<int>::iterator it = sx.begin(); it != sx.end(); ++it)
      if ((counter--) == 0) key = *it;
    vector<pair<int, int> > b, c;
    for (int i = 0; i < n; i++)
      if (a[i].first < key)
        b.push_back(a[i]);
      else if (a[i].first > key)
        c.push_back(a[i]);
    for (set<int>::iterator it = sy.begin(); it != sy.end(); ++it)
      result.push_back(make_pair(key, *it));
    solve(b);
    solve(c);
  } else {
    int counter = ((int)((sy).size())) / 2, key = -1;
    for (set<int>::iterator it = sy.begin(); it != sy.end(); ++it)
      if ((counter--) == 0) key = *it;
    vector<pair<int, int> > b, c;
    for (int i = 0; i < n; i++)
      if (a[i].second < key)
        b.push_back(a[i]);
      else if (a[i].second > key)
        c.push_back(a[i]);
    for (set<int>::iterator it = sx.begin(); it != sx.end(); ++it)
      result.push_back(make_pair(*it, key));
    solve(b);
    solve(c);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    a.push_back(make_pair(x, y));
  }
  solve(a);
  printf("%d\n", ((int)((result).size())));
  for (int i = 0; i < ((int)((result).size())); i++)
    printf("%d %d\n", result[i].first, result[i].second);
  return 0;
}
