#include<bits/stdc++.h>
struct node{int k,x,y;node(int k=0,int x=0,int y=0){this->k=k,this->x=x,this->y=y;}};
int t,n,m,k,pp=0,up[605],dn[605],f[2000005],sz[605],cnt,tmp;
int lst[605],nxt[2000005];
node vec[4000005];
void op1(int x)
{
//	printf("Push %d\n",x);
//	printf("%d %d\n",1,x);
	vec[++pp]=node(1,x,0);
	int val=f[++cnt];
	//up & dn (index)
	if (sz[x]==0) sz[x]=1,dn[x]=cnt;
	else if (sz[x]==1)
	{
		if (f[dn[x]]==val) sz[x]=0,dn[x]=0;
		else if (f[dn[x]]!=val) sz[x]=2,up[x]=cnt;
	}
	else if (sz[x]==2)
	{
		if (f[up[x]]==val) sz[x]=1,up[x]=0;
		else sz[x]=3,tmp=up[x],up[x]=cnt;
	}
	else if (sz[x]==3) assert(val==f[up[x]]),sz[x]=2,up[x]=tmp;
}
void op2(int x,int y)
{
//	printf("%d %d %d\n",2,x,y);
//	if (x==1&&y==2) printf("%d %d\n",f[dn[x]],f[dn[y]]);
	vec[++pp]=node(2,x,y);
	assert(f[dn[x]]==f[dn[y]]);
	if (sz[x]!=3) dn[x]=up[x],up[x]=0;
	else dn[x]=tmp,tmp=0;
	if (sz[y]!=3) dn[y]=up[y],up[y]=0;
	else dn[y]=tmp,tmp=0;
	--sz[x],--sz[y];
}
int qwq=0;
void solve(int x)
{
	for (int i=1;i<=n;i++)
	{
		if (f[up[i]]==f[x]){op1(i);return;}
		if (f[dn[i]]==f[x])
		{
			for (int s=1;s<=n;s++) if (sz[s]==0){op1(s);op2(s,i);return;}
		}
	}
	for (int i=1;i<=n;i++) if (sz[i]==0) qwq=0;
	for (int i=1;i<=n;i++) if (sz[i]==1&&i!=qwq){op1(i);return;}
	int c3=0;
	for (int i=1;i<=n;i++) if (sz[i]>=3) ++c3;
	assert(c3<=1);
	int cnt=0;
	for (int i=1;i<=n;i++) if (sz[i]==0) ++cnt;
	if (cnt>1)
	{
		for (int i=1;i<=n;i++) if (sz[i]==0) return op1(i);
	}
	if (cnt==1)
	{
//		puts("Special Case");
		int id=0;
		for (int i=1;i<=n;i++)
		{
			if (nxt[dn[i]]<nxt[up[i]])
			{
				if (!id) id=i;
				else if (nxt[dn[i]]<nxt[dn[id]]) id=i;
			}
		}
		if (id) return op1(id);
		qwq=0;
		for (int i=1;i<=n;i++) if (nxt[dn[i]]<nxt[dn[qwq]]||!qwq) qwq=i;
		for (int i=1;i<=n;i++) if (sz[i]==0) return op1(i);
	}
	assert(0);
}
int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	scanf("%d",&t);
	while (t--)
	{
		scanf("%d%d%d",&n,&m,&k);
		pp=0;
		for (int i=1;i<=m;i++) scanf("%d",&f[i]);
		for (int i=1;i<=k;i++) lst[i]=0;
		for (int i=m;i>=1;i--)
		{
			nxt[i]=lst[f[i]];
			lst[f[i]]=i;
		}
		cnt=0;
		for (int i=1;i<=m;i++)
		{
			solve(i);
//			for (int x=1;x<=n;x++) printf("%d %d\n",up[x],dn[x]);
//			printf("tmp = %d(%d)\n",tmp,qwq);
		}
		printf("%d\n",pp);
		for (int i=1;i<=pp;i++)
			if (vec[i].k==1) printf("1 %d\n",vec[i].x);
			else printf("2 %d %d\n",vec[i].x,vec[i].y);
//		puts("---------------------");
//		return 0;
//		for (int i=1;i<=n;i++) printf("(%d)%d %d\n",sz[i],up[i],dn[i]);
//		printf("%d %d\n",tmp,qwq);
	}
	return 0;
}