#include <bits/stdc++.h>
using namespace std;
int q[2002][5005],res[1001000][4],flag[2002][2002],l[2002],r[2002],have[2002],cnt,n;
queue <int> NO;
void try1(int n,int m,int k)
{
	int q[100100];
	int x,l=1,r=0,ans=0;
	while (m--)
	{
		scanf("%d",&x);
		if (q[l]!=x&&q[r]!=x)
		{
			ans++;
			res[ans][1]=1;
			res[ans][2]=1;
			r++;
			q[r]=x;
		}
		else if (q[l]==x)
		{
			ans++;
			res[ans][1]=1;res[ans][2]=2;
			ans++;
			res[ans][1]=2;res[ans][2]=1;res[ans][3]=2;
			l++;
		}
		else if (q[r]==x)
		{
			ans++;
			res[ans][1]=1;res[ans][2]=1;
			r--;
		}
	}
	printf("%d\n",ans);
	for (int i=1;i<=ans;i++)
	{
		if (res[i][1]==1)
			printf("%d %d\n",res[i][1],res[i][2]);
		else printf("%d %d %d\n",res[i][1],res[i][2],res[i][3]);
	}
}
void check(int i)
{
	if (have[i])
	for (int j=1;j<=n-1;j++)
		if (have[j]&&i!=j)
			{
				if (q[i][l[i]]==q[j][l[j]])
				cnt++;
				res[cnt][1]=2;res[cnt][2]=i;res[cnt][3]=j;
				l[i]++;
				l[j]++;
				if (l[i]>r[i])have[i]=0;else check(i);
				if (l[j]>r[j])have[j]=0;else check(j);
			}
}
int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int m,k,num=0;
		cnt=0;
		memset(have,0,sizeof(have));
		scanf("%d%d%d",&n,&m,&k);
		if (n==2)
		{
			try1(n,m,k);
			continue;
		}
		while (m--)
		{
			int x;
			scanf("%d",&x);
			if (num<n-1)
			{
				bool flag1=1;
				for (int i=1;i<=num;i++)
					if (flag[x][i])
					{
						cnt++;
						//printf("op=1 %d\n",cnt);
						res[cnt][1]=1;res[cnt][2]=i;
						flag[x][i]--;
						NO.push(i);
						have[i]=0;
						flag1=0;
						break;
					}
				if (flag1)
				{
					cnt++;
					//printf("op=2 %d\n",cnt);
					res[cnt][1]=1;res[cnt][2]=num+1;
					num++,l[num]=1,r[num]=1;
					have[num]=1;
					q[num][r[num]]=x;
					flag[x][num]++;
				}
			}
			else
			{
				bool flag2=1;
				for (int i=1;i<=num;i++)
					if (q[i][r[i]]==x)
					{
						cnt++;
						//printf("op=3 %d\n",cnt);
						res[cnt][1]=1;res[cnt][2]=i;
						r[i]--;
						if (l[i]>r[i])NO.push(num),have[i]=0;
						flag[x][i]--;
						flag2=0;
						break;
					}
					else if (q[i][l[i]]==x)
					{
						cnt++;
						res[cnt][1]=1;res[cnt][2]=n;
						cnt++;
						//printf("op=4 %d\n",cnt);
						res[cnt][1]=2;res[cnt][2]=i;res[cnt][3]=n;
						l[i]++;
						if (l[i]>r[i])NO.push(num),have[i]=0;
						else
						{
							check(i);
						}
						flag[x][i]--;
						flag2=0;
						break;
					}
				if (flag2)
				{
					if (!NO.empty())
					{
						int id=NO.front();
						NO.pop();
						r[id]++;
						q[id][r[id]]=x;
						cnt++;
						have[id]=1;
						//printf("op=5 %d\n",cnt);
						res[cnt][1]=1;res[cnt][2]=id;
						flag[x][id]++;
					}
					else
					{
						bool flag3=1;
						for (int i=1;i<=n-1;i++)
							if (flag[x][i]==0)
							{
								flag3=0;
								cnt++;
								//printf("op=6 %d\n",cnt);
								res[cnt][1]=1;res[cnt][2]=i;
								r[i]++;
								q[i][r[i]]=x;
								flag[x][i]++;
								break;
							}
						if (flag3)
						{
							cnt++;
							//printf("op=7 %d\n",cnt);
							res[cnt][1]=1;res[cnt][2]=1;
							flag[x][1]++;
							r[1]++;
							q[1][r[1]]=x;
						}
					}
				}
			}
		}
		bool flag1=0;
		for (int i=1;i<=num;i++)
			if (have[i]==1)
				flag1=1;
		while (flag1)
		{
			for (int i=1;i<=num;i++)
				if (have[i])
					for (int j=1;j<=num;j++)
						if (have[j]&&i!=j)
						{
							if (q[i][l[i]]==q[j][l[j]])
							cnt++;
							res[cnt][1]=2;res[cnt][2]=i;res[cnt][3]=j;
							l[i]++;
							l[j]++;
							if (l[i]>r[i])have[i]=0;
							if (l[j]>r[j])have[j]=0;
						}
			flag1=0;
			for (int i=1;i<=num;i++)
				if (have[i]==1)
					flag1=1;
		}
		printf("%d\n",cnt);
		for (int i=1;i<=cnt;i++)
		{
			if (res[i][1]==1)
				printf("%d %d\n",res[i][1],res[i][2]);
			else printf("%d %d %d\n",res[i][1],res[i][2],res[i][3]);
		}
	}
	return 0;
}
/*
1
2 4 2
1 2 1 2
*/