#include <bits/stdc++.h>
void solution();
int main() {
  solution();
  return 0;
}
struct line {
  int n, p[3000];
} l[3000], t;
int n;
void print() {
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) printf("%d ", l[i].p[j]);
    printf("\n");
  }
}
int get(int q, int p) {
  for (int i = 0; i < n; i++) {
    if (l[q].p[i]) p--;
    if (p == 0) return i;
  }
}
void solution() {
  int i, j, z, x, y, min, imin, offset, m = 0, arr[100000][3];
  bool f[1001];
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) l[i].p[j] = 0;
    l[i].n = 0;
    f[i] = true;
  }
  for (i = 0; i < n - 1; i++) {
    scanf("%d %d", &x, &y);
    l[x - 1].n++;
    l[x - 1].p[y - 1] = 1;
  }
  for (i = 0; i < n; i++) {
    min = 1001;
    imin = -1;
    for (j = i; j < n; j++) {
      if (l[j].n < min) {
        min = l[j].n;
        imin = j;
      }
    }
    if (i != imin) {
      t = l[i];
      l[i] = l[imin];
      l[imin] = t;
      arr[m][0] = 1;
      arr[m][1] = i + 1;
      arr[m][2] = imin + 1;
      m++;
    }
  }
  offset = 0;
  for (i = 1; i < n; i++) {
    for (j = 0; j < l[i].n; j++) {
      x = get(i, j + 1);
      if (x < i)
        f[x] = false;
      else {
        while (!f[offset]) offset++;
        y = offset;
        for (z = 0; z < n; z++) {
          min = l[z].p[x];
          l[z].p[x] = l[z].p[y];
          l[z].p[y] = min;
        }
        f[offset++] = false;
        arr[m][0] = 2;
        arr[m][1] = y + 1;
        arr[m][2] = x + 1;
        m++;
      }
    }
  }
  printf("%d\n", m);
  for (i = 0; i < m; i++) printf("%d %d %d\n", arr[i][0], arr[i][1], arr[i][2]);
}
