#include<iostream>
#include<vector>
using namespace std;
#define f first
#define s second
typedef pair<int,int> pii;
struct ANS{
int str, from, to;
};
const int mx = 100000+5;
int N, M;
vector<pii> node(2*mx); // node[i].first = opposite, node[i].second = line_index
vector<ANS> ans;
vector<pii> line(mx);
bool vis[2*mx];
int cnt[2*mx] = {0};
int main() {
cin>>N;
M = 2*N;
int base = 1, base_cnt = 0;
for(int i=0; i<N; i++) {
int a, b;
cin>>a>>b;
node[a] = {b, i};
node[b] = {a, i};
line[i] = {a, b};
int k = (a+b)%M;
if((k&1)==0) continue;
cnt[k]++;
if(cnt[k]>base_cnt) {
base_cnt = cnt[k];
base = k;
}
}
for(int i = 0; i<N; i++) {
if(line[i].f + line[i].s == base) {
vis[line[i].f] = vis[line[i].s] = true;
continue;
}
}
//cout<<"base = "<<base<<"start = "<<start<<'\n';
for(int i=0; i<M; i++) {
if(vis[i]) continue;
int start = i;
int t = (base - start + M) % M;
int opp = node[i].f;
ans.push_back({node[i].s, opp, t});
vis[start] = vis[t] = true;
start = opp;
while(!vis[start]) {
int target = (base - start + M) % M;
int opp = node[target].f;
int line = node[target].s;
ans.push_back({line, opp, start});
vis[target] = vis[start] = true;
start = opp;
}
}
cout<<ans.size()<<'\n';
for(auto [line, from, to]:ans) cout<<line<<" "<<from<<' '<<to<<'\n';
}