#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int MOD = 1000000007;
bool tab[1002][1002];
vector<pair<vector<int>, int> > vec, col;
int pos[1002], who[1002];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, a, b;
  cin >> n;
  vec.resize(n);
  for (int i = 0; i < n - 1; ++i) {
    cin >> a >> b, a--, b--;
    tab[a][b] = 1;
  }
  for (int i = 0; i < n; ++i) {
    vec[i].second = i;
    who[i] = i;
    pos[i] = i;
    for (int j = n - 1; j >= 0; j--)
      if (tab[i][j]) vec[i].first.push_back(j);
  }
  vector<pair<int, pair<int, int> > > ans;
  sort((vec).begin(), (vec).end());
  for (int i = 0; i < n; i++)
    if (pos[vec[i].second] != i) {
      for (int j = 0; j < n; ++j) {
        swap(tab[i][j], tab[pos[vec[i].second]][j]);
      }
      ans.push_back({1, {pos[vec[i].second], i}});
      swap(who[pos[vec[i].second]], who[i]);
      swap(pos[vec[i].second], pos[who[pos[vec[i].second]]]);
    }
  col.resize(n);
  for (int i = 0; i < n; ++i) {
    col[i].second = i;
    pos[i] = i;
    who[i] = i;
    for (int j = 0; j < n; j++)
      if (tab[j][i]) col[i].first.push_back(j);
    if (!(long long)col[i].first.size()) {
      for (int j = 0; j < n; ++j) col[i].first.push_back(1000000000);
    }
  }
  sort((col).begin(), (col).end());
  for (int i = 0; i < n; ++i)
    if (pos[col[i].second] != i) {
      ans.push_back({2, {pos[col[i].second], i}});
      swap(who[pos[col[i].second]], who[i]);
      swap(pos[col[i].second], pos[who[pos[col[i].second]]]);
    }
  cout << (long long)ans.size() << "\n";
  for (auto it : ans)
    cout << it.first << " " << it.second.first + 1 << " "
         << it.second.second + 1 << "\n";
  return 0;
}
