#include <bits/stdc++.h>
using namespace std;
int m[1000][1000], n, moves;
pair<int, int> largest_1[1000];
int ans[100000][3];
bool no_zero[1000];
void read() {
  assert(scanf("%d", &n) == 1);
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    assert(scanf("%d%d", &a, &b) == 2);
    --a;
    --b;
    m[a][b] = 1;
  }
}
void columns() {
  for (int j = n - 1; j >= 0; --j) {
    bool zero = true;
    for (int i = 0; i < n && zero; ++i) zero = (m[i][j] == 0);
    no_zero[j] = zero;
  }
  for (int j = n - 1; j >= 0; --j) {
    if (no_zero[j]) continue;
    int col_change = -1;
    for (int k = j - 1; k >= 0 && col_change == -1; --k)
      if (no_zero[k]) col_change = k;
    if (col_change != -1) {
      ans[moves][0] = 2;
      ans[moves][1] = j;
      ans[moves][2] = col_change;
      ++moves;
      swap(no_zero[j], no_zero[col_change]);
      for (int i = 0; i < n; ++i) swap(m[i][j], m[i][col_change]);
    }
  }
}
void rows() {
  for (int i = 0; i < n; ++i) {
    largest_1[i].second = i;
    largest_1[i].first = -1;
    for (int j = 0; j < n; ++j)
      if (m[i][j]) largest_1[i].first = j;
  }
  sort(largest_1, largest_1 + n, greater<pair<int, int> >());
  int curr_line = n - 1;
  for (int i = 0; i < n; ++i)
    if (largest_1[i].first != -1) {
      int line = largest_1[i].second;
      if (line == curr_line)
        --curr_line;
      else {
        ans[moves][0] = 1;
        ans[moves][1] = line;
        ans[moves][2] = curr_line;
        ++moves;
        for (int j = 0; j < n; ++j) swap(m[i][line], m[curr_line][line]);
        for (int j = 0; j < n; ++j)
          if (largest_1[j].second == curr_line) {
            largest_1[j].second = line;
            break;
          }
        largest_1[i].second = curr_line;
        --curr_line;
      }
    }
}
void write() {
  printf("%d\n", moves);
  for (int i = 0; i < moves; ++i)
    printf("%d %d %d\n", ans[i][0], ans[i][1] + 1, ans[i][2] + 1);
}
int main() {
  read();
  columns();
  rows();
  write();
}
