#include <bits/stdc++.h>
using namespace std;
int n;
int tb[1010][1010];
int col[1010];
int row[1010];
typedef struct store {
  int p, q, r;
} data;
int get_nonempty_row(int b, int t) {
  for (int i = b; i >= t; i--) {
    if (row[i] != 0) {
      return i;
    }
  }
  return 0;
}
void printtable() {
  cout << "table\n";
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << tb[i][j] << " ";
    }
    cout << "\n";
  }
}
int main() {
  cin >> n;
  int a, b;
  for (int i = 1; i < n; i++) {
    cin >> a >> b;
    row[a]++;
    col[b]++;
    tb[a][b] = 1;
  }
  int erow, ecol;
  for (int i = 1; i <= n; i++) {
    if (row[i] == 0) erow = i;
    if (col[i] == 0) ecol = i;
  }
  int rind, cind;
  int x, y;
  vector<data> ans;
  data temp;
  for (int i = n; i > 1; i--) {
    if (ecol != i) {
      temp.p = 2;
      temp.q = ecol;
      temp.r = i;
      swap(col[i], col[ecol]);
      for (int j = 1; j <= n; j++) {
        swap(tb[j][ecol], tb[j][i]);
      }
      ecol = i;
      ans.push_back(temp);
    }
    rind = get_nonempty_row(i, 1);
    if (rind == 0) break;
    temp.p = 1, temp.q = i, temp.r = rind;
    if (i != rind) {
      ans.push_back(temp);
    }
    swap(row[i], row[rind]);
    for (int j = i - 1; j >= 1; j--) {
      swap(tb[i][j], tb[rind][j]);
      if (tb[i][j] == 1) col[j]--;
      if (col[j] == 0) ecol = j;
    }
  }
  cout << ans.size() << "\n";
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].p << " " << ans[i].q << " " << ans[i].r << "\n";
  }
}
