#include "bits/stdc++.h"
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
map<int, int> Puntaje;
vector< pair<int, int> > Pares(n);
for(int i = 0; i < n; i++){
cin>>Pares[i].first>>Pares[i].second;
Puntaje[(Pares[i].first + Pares[i].second) % (2 * n)]++;
}
int Mayor = -2, Valor = -2, Tiempo = n;
for(int i = 1; i < n * 2; i += 2){
if(Puntaje[i] > Mayor){
Mayor = Puntaje[i];
Valor = i;
Tiempo = n - Puntaje[i];
}
}
cerr<<Valor<<"\n";
set< pair<int, int> > Pares_posibles;
int A_adir = Valor;
for(int i = 0; i < n * 2; i++){
cerr<<i<<" "<<A_adir<<"\n";
Pares_posibles.insert({i, A_adir});
A_adir--;
if(A_adir < 0) A_adir = n * 2 - 1;
}
cout<<Tiempo<<"\n";
set< pair< pair<int, int>, int > > Considerar;
for(int i = 0; i < n; i++){
if(Pares_posibles.count(Pares[i]) == 1){
Pares_posibles.erase(Pares[i]);
swap(Pares[i].first, Pares[i].second);
Pares_posibles.erase(Pares[i]);
continue;
}
Considerar.insert({Pares[i], i});
swap(Pares[i].first, Pares[i].second);
Considerar.insert({Pares[i], i});
}
//cerr<<"\n";
if(Considerar.empty()) return 0;
for(auto E = Considerar.begin(); E != Considerar.end(); ){
auto cE = *E;
auto e = Pares_posibles.lower_bound({cE.first.first, -2});
int Extremo = e->second;
//cerr<<E.first.first<<" "<<E.first.second<<" "<<Extremo<<" Dato.\n";
if((Extremo + cE.first.first) % (2 * n) != Valor){
e = Pares_posibles.lower_bound({cE.first.second, -2});
Extremo = e->second;
cout<<cE.second<<" "<<cE.first.first<<" "<<Extremo<<"\n";
Pares_posibles.erase({cE.first.second, Extremo});
Pares_posibles.erase({Extremo, cE.first.second});
Considerar.erase(cE);
swap(cE.first.first, cE.first.second);
Considerar.erase(cE);
E = Considerar.lower_bound({{Extremo, -2}, -2});
continue;
}
cout<<cE.second<<" "<<cE.first.second<<" "<<Extremo<<"\n";
Pares_posibles.erase({cE.first.first, Extremo});
Pares_posibles.erase({Extremo, cE.first.first});
Considerar.erase(cE);
swap(cE.first.first, cE.first.second);
Considerar.erase(cE);
E = Considerar.lower_bound({{Extremo, -2}, -2});
}
return 0;
}