#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cout << name << " : " << arg1 << '\n';
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const long long N = 3e5 + 7;
long long n;
long long arr[N];
long long mat[1004][1004];
vector<pair<long long, pair<long long, long long> > > ans;
void swapcol(long long x, long long y) {
  for (long long i = 1; i < n + 1; i++) {
    swap(mat[i][x], mat[i][y]);
  }
}
void swaprow(long long x, long long y) {
  for (long long i = 1; i < n + 1; i++) {
    swap(mat[x][i], mat[y][i]);
  }
}
long long getrow(long long x, long long s) {
  long long cnt = 0;
  for (long long i = 1; i < s + 1; i++) cnt += mat[x][i];
  return cnt;
}
long long getcol(long long x, long long s) {
  long long cnt = 0;
  for (long long i = 1; i < s + 1; i++) cnt += mat[i][x];
  return cnt;
}
void getans(long long s) {
  if (s == 1) return;
  long long ridx = s, mx = 0, cidx = s;
  for (long long i = 1; i < s + 1; i++) {
    long long cval = getcol(i, s);
    long long rval = getrow(i, s);
    if (cval == 0) cidx = i;
    if (mx <= rval) mx = rval, ridx = i;
  }
  if (cidx != s) {
    ans.push_back({2, {cidx, s}});
    swapcol(cidx, s);
  }
  if (ridx != s) {
    ans.push_back({1, {ridx, s}});
    swaprow(s, ridx);
  }
  getans(s - 1);
}
void solve() {
  cin >> n;
  for (long long i = 0; i < n - 1; i++) {
    long long r, c;
    cin >> r >> c;
    mat[r][c] = 1;
  }
  getans(n);
  cout << (long long)ans.size() << '\n';
  for (long long i = 0; i < (long long)ans.size(); i++) {
    cout << ans[i].first << " " << ans[i].second.first << " "
         << ans[i].second.second << '\n';
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  while (t--) solve();
}
