#include <bits/stdc++.h>
using namespace std;
struct node {
  vector<int> a;
  int cnt, id;
} r[1003], c[1003];
struct ANS {
  int op, x, y;
  ANS(){};
  ANS(int op, int x, int y) : op(op), x(x), y(y){};
} ans[100005];
bool cmp1(node x, node y) {
  return x.cnt < y.cnt || (x.cnt == y.cnt && x.a.size() && y.a.size() &&
                           x.a.back() < y.a.back());
}
bool cmp2(node x, node y) {
  return x.cnt > y.cnt || (x.cnt == y.cnt && x.a.size() &&
                           y.a.size() & x.a.front() < y.a.front());
}
int m;
int main() {
  int n, x, y, i, j;
  scanf("%d", &n);
  for (i = 0; i < n; i++) r[i].id = i;
  for (i = 0; i < n - 1; i++) {
    scanf("%d%d", &x, &y);
    x--;
    y--;
    r[x].a.push_back(y);
    r[x].cnt++;
  }
  sort(r, r + n, cmp1);
  for (i = n - 1; i >= 0; i--) {
    if (!r[i].cnt) continue;
    if (r[i].id != i) {
      ans[m++] = ANS(1, r[i].id + 1, i + 1);
      for (j = i - 1; j >= 0; j--)
        if (r[j].id == i) {
          r[j].id = r[i].id;
          break;
        }
    }
  }
  for (i = 0; i < n; i++) c[i].id = i;
  for (i = 0; i < n; i++)
    for (j = 0; j < r[i].a.size(); j++) {
      int v = r[i].a[j];
      c[v].a.push_back(i);
      c[v].cnt++;
    }
  sort(c, c + n, cmp2);
  for (i = n - 1; i >= 0; i--) {
    if (!c[i].cnt) continue;
    if (c[i].id != i) {
      ans[m++] = ANS(2, c[i].id + 1, i + 1);
      for (j = i - 1; j >= 0; j--)
        if (c[j].id == i) {
          c[j].id = c[i].id;
          break;
        }
    }
  }
  printf("%d\n", m);
  for (i = 0; i < m; i++) printf("%d %d %d\n", ans[i].op, ans[i].x, ans[i].y);
  return 0;
}
