// https://szkopul.edu.pl/problemset/problem/CNaWaG3_YWfd96Qi6T36RnO0/site/?key=statement
#include <bits/stdc++.h>
using namespace std;
constexpr int sizik = 1000 * 1001;
#define ar std::array
#define pr std::pair
#define vec std::vector
#define ca const auto
typedef long long ll;
typedef vec<vec<int>> _kra;
typedef ar<int, 3> Trio;
typedef ar<int, 2> Duo;
Duo ans[sizik], _in[sizik];
bool visited[sizik];
void solve() {
int n;
std::cin >> n;
// [p, k, i]
std::vector<Trio> v(n);
int j = 0;
for (auto& [p, k, i] : v) {
std::cin >> p >> k;
i = ++j;
_in[i] = {p, k};
}
std::sort(v.begin(), v.end(), [](ca& a, ca& b) {
if (a[1] > b[1]) {
return false;
} else if (a[1] == b[1]) {
return a[0] < b[0];
} else {
return true;
}
});
int last_u = 0, last_v = 0, z = 0, p1 = 0, p2 = 0, curr = 0;
while ((int)v.size() > 0) {
if (z == 0) {
int i1 = -1;
for (; p1 < (int)v.size(); p1++) {
if (!visited[p1] && v[p1][0] >= last_v && v[p1][0] >= last_u) {
visited[p1] = true;
ans[++curr][0] = v[p1][2];
i1 = 0;
break;
}
}
z = 1;
if (i1 == -1) break;
} else if (z == 1) {
int i1 = -1;
for (; p2 < (int)v.size(); p2++) {
if (!visited[p2] && v[p2][0] >= last_u) {
visited[p2] = true;
ans[curr][1] = v[p2][2];
i1 = 0;
last_v = _in[ans[curr][1]][1];
last_u = _in[ans[curr][0]][1];
break;
}
}
z = 0;
if (i1 == -1) break;
}
}
if (ans[curr][1] == 0) {
curr--;
}
std::vector<int> ans2{v[0][2]};
for (int i = 1; i < n; i++) {
if (_in[ans2[ans2.size() - 1]][1] <= v[i][0]) {
ans2.push_back(v[i][2]);
} else {
}
}
ans2.push_back(n + 1);
_in[n + 1] = {INT_MAX, INT_MAX};
int NewV = 0;
ans2.pop_back();
if (NewV == 0) {
NewV = ans2[ans2.size() - 1];
ans2.pop_back();
}
if ((int)ans2.size() > curr) {
std::cout << ans2.size() << '\n';
for (int i = 0; i < ans2.size(); i++) {
std::cout << ans2[i] << " " << NewV << '\n';
}
} else {
std::cout << curr << '\n';
for (int i = 1; i <= curr; i++) {
std::cout << ans[i][0] << " " << ans[i][1] << '\n';
}
}
}
int32_t main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int t = 1;
// std::cin >> t;
for (; t > 0; t--) {
solve();
}
return 0;
}