#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1005, MaxActions = 200005;
struct nesto {
  int cnt, sec, idx;
} row[MaxN], col[MaxN];
struct action {
  int t, i, j;
  action(int _t, int _i, int _j) {
    t = _t;
    i = _i;
    j = _j;
  }
};
vector<action> sol;
int n;
int curr[MaxN], pos[MaxN];
bool cmp1(nesto a, nesto b) {
  return a.cnt < b.cnt || (a.cnt == b.cnt && a.sec < b.sec);
}
bool cmp2(nesto a, nesto b) {
  return a.cnt > b.cnt || (a.cnt == b.cnt && a.sec < b.sec);
}
void shuffle(nesto a[], int t) {
  for (int i = 1; i <= n; i++) {
    int j = rand() % (n - i + 1) + i;
    if (i == j) continue;
    sol.push_back(action(t, i, j));
    swap(a[i], a[j]);
  }
}
void process(nesto a[], int t) {
  for (int i = 1; i <= n; i++) curr[i] = pos[i] = i;
  for (int i = 1; i <= n; i++) {
    int j = pos[a[i].idx];
    if (i != j) {
      sol.push_back(action(t, i, j));
      swap(curr[i], curr[j]);
      pos[curr[j]] = j;
    }
  }
}
int a[MaxN][MaxN], b[MaxN][MaxN];
int main() {
  memset(a, 0, sizeof(a));
  sol.clear();
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    row[i].cnt = col[i].cnt = 0;
    row[i].sec = 0;
    col[i].sec = n + 1;
    row[i].idx = col[i].idx = i;
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    a[x][y]++;
    row[x].cnt++;
    row[x].sec = max(row[x].sec, y);
    col[y].cnt++;
  }
  sort(row + 1, row + n + 1, cmp1);
  process(row, 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (a[row[i].idx][j]) col[j].sec = min(col[j].sec, i);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) b[i][j] = a[row[i].idx][j];
  sort(col + 1, col + n + 1, cmp2);
  process(col, 2);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) a[i][j] = b[i][col[j].idx];
  printf("%d\n", sol.size());
  for (int i = 0, sz = sol.size(); i < sz; i++)
    printf("%d %d %d\n", sol[i].t, sol[i].i, sol[i].j);
  return 0;
}
