#include<bits/stdc++.h>
using namespace std;
const int NUM=305;
const int INF=0x3f3f3f3f;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9')
	{
		x=x*10+(c-'0');
		c=getchar();
	}
	return x*f;
}
int t,n,m,k,a[2000005],nxt[2000005],lst[NUM<<1];
deque<int> q[NUM];
bool vis[NUM],used[NUM][NUM<<1];
int vec[NUM*2];
struct AAA
{
	int opt,x[2];
}ans[4000005];
int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int x,y;
	t=read();
	while(t--)
	{
		bool flag,gg;
		int id,re=0;
		memset(used,false,sizeof(used));
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++) a[i]=read();
		for(int i=1;i<=k;i++) lst[i]=m+1;
		for(int i=m;i;i--)
		{
			nxt[i]=INF;
			for(int j=1;j<=k;j++)
				if(a[i]!=j) nxt[i]=min(nxt[i],lst[j]);
		}
		for(int i=1;i<=m;i++)
		{
			gg=flag=false,id=0;
			for(int j=1;j<=n;j++)
			{
				if(!q[j].empty()&&q[j].back()==a[i])
				{
					q[j].pop_back();
					used[j][a[i]]=false;
					ans[++re].opt=1,ans[re].x[0]=j;
					flag=true;
					break;
				}
			}
			if(flag) continue;
			for(int j=1;j<=n;j++)
			{
				if(q[j].empty())
				{
					if(id) gg=true;
					id=j;
				}
			}
			for(int j=1;j<=n;j++)
			{
				if(!q[j].empty()&&q[j].front()==a[i])
				{
					if(id)
					{
						q[j].pop_front();
						ans[++re].opt=1,ans[re].x[0]=id;
						ans[++re].opt=2,ans[re].x[0]=id,ans[re].x[1]=j;
						used[j][a[i]]=false;
						flag=true;
						break;
					}
					
				}
			}
			if(flag)
			{
				Again:
				for(int j=1;j<=k;j++) vec[j]=0;
				for(int j=1;j<=n;j++)
				{
					if(q[j].empty()) continue;
					if(vec[q[j].front()])
					{
						x=j,y=vec[q[j].front()];
						used[x][q[x].front()]=false;
						used[y][q[y].front()]=false;
						q[x].pop_front(),q[y].pop_front();
						ans[++re].opt=2,ans[re].x[0]=x,ans[re].x[1]=y;
						goto Again;
					}
					else vec[q[j].front()]=j;
				}
				continue;
			}
			for(int j=1;j<=n;j++) vis[j]=false;
			for(int j=1;j<=n;j++)
			{
				if(used[j][a[i]]) vis[j]=true;
				if(!q[j].empty()&&q[j].back()==nxt[i])
					vis[j]=true;
				if(!q[j].empty()&&q[j].front()==nxt[i])
					vis[id]=true;
			}
			for(int j=1;j<=n;j++)
			{
				if(!vis[j]&&!q[j].empty())
				{
					q[j].push_back(a[i]);
					ans[++re].opt=1,ans[re].x[0]=j;
					used[j][a[i]]=true;
					flag=true;
					break;
				}
			}
			if(flag) continue;
			for(int j=1;j<=n;j++)
			{
				if(q[j].empty())
				{
					q[id].push_back(a[i]);
					ans[++re].opt=1,ans[re].x[0]=id;
					used[id][a[i]]=true;
					flag=true;
					break;
				}
			}
			if(flag) continue;
			for(int j=1;j<=n;j++)
			{
				if(!used[j][a[i]])
				{
					ans[++re].opt=1,ans[re].x[0]=j;
					used[id][a[i]]=true;
					break;
				}
			}
		}
		printf("%d\n",re);
		for(int i=1;i<=re;i++)
		{
			printf("%d %d",ans[i].opt,ans[i].x[0]);
			if(ans[i].opt==2) printf(" %d",ans[i].x[1]);
			printf("\n");
		}
//		for(int i=1;i<=n;i++)
//		{
//			if(!q[i].empty())
//			{
//				printf("GG");
//				exit(0);
//			}
//		}
	}
}