题干:

You are given a square matrix consisting of n rows and n columns. We assume that the rows are numbered from 1 to n from top to bottom and the columns are numbered from 1to n from left to right. Some cells (n - 1 cells in total) of the the matrix are filled with ones, the remaining cells are filled with zeros. We can apply the following operations to the matrix:

  1. Swap i-th and j-th rows of the matrix;
  2. Swap i-th and j-th columns of the matrix.

You are asked to transform the matrix into a special form using these operations. In that special form all the ones must be in the cells that lie below the main diagonal. Cell of the matrix, which is located on the intersection of the i-th row and of the j-th column, lies below the main diagonal if i > j.

Input

The first line contains an integer n (2 ≤ n ≤ 1000) — the number of rows and columns. Then follow n - 1 lines that contain one's positions, one per line. Each position is described by two integers xk, yk (1 ≤ xk, yk ≤ n), separated by a space. A pair (xk, yk) means that the cell, which is located on the intersection of the xk-th row and of the yk-th column, contains one.

It is guaranteed that all positions are distinct.

Output

Print the description of your actions. These actions should transform the matrix to the described special form.

In the first line you should print a non-negative integer m (m ≤ 105) — the number of actions. In each of the next m lines print three space-separated integers t, i, j(1 ≤ t ≤ 2, 1 ≤ i, j ≤ n, i ≠ j), where t = 1 if you want to swap rows, t = 2 if you want to swap columns, and i and j denote the numbers of rows or columns respectively.

Please note, that you do not need to minimize the number of operations, but their number should not exceed 105. If there are several solutions, you may print any of them.

Examples

Input

2
1 2

Output

2
2 1 2
1 1 2

Input

3
3 1
1 3

Output

3
2 2 3
1 1 3
1 1 2

Input

3
2 1
3 2

Output

0

题目大意:

给你一个n*n的矩阵并且其中有n-1个位置是1(其他位置是0)

每次可以交换其中任意两行或者两列

求在10^5个交换内把所有的1都交换到对角线以下(横坐标大于纵坐标)的方法

答案可以有很多,写出任意一个即可。(并且某次交换中 行==列  是不允许的)

解题报告:

   其实这道题想出来就不难了,,,代码也不算难实现,,坑也不算多。。(问题就是想不到啊还是做题少了)

   思路就是我们因为有n-1个1,所以肯定存在一列里面全为0,此时把这一列移到最右边。然后再找一行有1的,把他和最后一行交换。(也可以  如果最后一行全为0  ,才执行第二个操作)

此时,我们就可以把问题变成在前(n-1)*(n-1)的矩阵中把最多n-2个点移到左下角的问题

   有个小细节,因为行列相等不算交换,,所以循环中就不能加for(i=1;i<=n;i++)中的等号了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int maze[1005][1005];
int x[MAX],y[MAX];
int tot;
struct Node {
	int t,a,b;
	Node(){}
	Node(int t,int a,int b):t(t),a(a),b(b){}
} node[MAX];
void dfs(int n) {
	if(n == 1) return ;
	for(int j = 1; j<n; j++) {//枚举每一列 
		if(y[j] == 0) {
			for(int i = 1; i<=n; i++) swap(maze[i][j],maze[i][n]);
			swap(y[j],y[n]);
			node[++tot] = Node(2,j,n); 
			break;
		}
	}
	for(int i = 1; i<n; i++) {//枚举每一行 
		if(x[i] != 0) {
			for(int j = 1; j<=n; j++) swap(maze[i][j],maze[n][j]);
			swap(x[i],x[n]);
			node[++tot] = Node(1,i,n);
			break;
		}
	}
	for(int j = 1; j<=n-1; j++) {
		if(maze[n][j] == 1) y[j]--;
	}
	dfs(n-1);
}
int main()
{
	int all;
	cin>>all;
	for(int i = 1; i<=all-1; i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		maze[a][b]=1;
		x[a]++;y[b]++;
	}
	dfs(all);
	printf("%d\n",tot);
	for(int i = 1; i<=tot; i++) printf("%d %d %d\n",node[i].t,node[i].a,node[i].b);
	return 0 ;
 }