#include <bits/stdc++.h>
using namespace std;
struct Opr {
  int a, b, c;
  Opr() {}
  Opr(int _a, int _b, int _c) {
    a = _a;
    b = _b;
    c = _c;
    b++;
    c++;
  }
};
vector<Opr> vec;
int N;
bool mp[1005][1005];
int row[1005], col[1005];
struct Unit {
  int r, c;
};
Unit ut[1005];
void get_data() {
  memset(mp, 0, sizeof(mp));
  scanf("%d", &N);
  for (int i = 0; i < N - 1; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    ut[i].r = a;
    ut[i].c = b;
    mp[a][b] = 1;
    row[a]++;
    col[b]++;
  }
}
void opr(int typ, int a, int b) {
  if (a == b) return;
  if (typ == 1) {
    for (int i = 0; i < N - 1; i++) {
      if (ut[i].r == a)
        ut[i].r = b;
      else if (ut[i].r == b)
        ut[i].r = a;
    }
    swap(row[a], row[b]);
    vec.push_back(Opr(typ, a, b));
  } else {
    for (int i = 0; i < N - 1; i++) {
      if (ut[i].c == a)
        ut[i].c = b;
      else if (ut[i].c == b)
        ut[i].c = a;
    }
    swap(col[a], col[b]);
    vec.push_back(Opr(typ, a, b));
  }
}
void proc(int n) {
  int vmin = 0;
  for (int i = 0; i < n; i++) {
    if (col[i] < col[vmin]) vmin = i;
  }
  opr(2, vmin, n - 1);
  int vmax = 0;
  for (int i = 0; i < n; i++) {
    if (row[i] > row[vmax]) vmax = i;
  }
  opr(1, vmax, n - 1);
  for (int i = 0; i < N - 1; i++) {
    if (ut[i].r == n - 1) col[ut[i].c]--;
  }
}
void run() {
  vec.clear();
  for (int i = N; i >= 2; i--) proc(i);
  printf("%d\n", ((int)(vec).size()));
  for (int i = 0; i < ((int)(vec).size()); i++)
    printf("%d %d %d\n", vec[i].a, vec[i].b, vec[i].c);
}
int main() {
  get_data();
  run();
  return 0;
}
