#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
#define LL long long
using namespace std;
const int MAXN=705;
int n,m,k;
int opt[MAXN<<1];
int a[MAXN];
int u[MAXN<<1],v[MAXN<<1];
int sum[MAXN<<1];
int p=0;
int st0[MAXN];
int st_top[MAXN],st_low[MAXN];
int a_id[MAXN];
int c_st[MAXN];
int next[MAXN];
int last[MAXN];
int top[MAXN];
namespace SGT
{
	class SegmentTree
	{
		public:
			int i1,i2;
	}sgt[MAXN<<2];
	#define LSON (now<<1)
	#define RSON (now<<1|1)
	#define MIDDLE ((left+right)>>1)
	#define LEFT LSON,left,MIDDLE
	#define RIGHT RSON,MIDDLE+1,right
	void PushUp(const int now)
	{
		sgt[now].i1=sgt[LSON].i1|sgt[RSON].i1;
		sgt[now].i1=sgt[LSON].i2|sgt[RSON].i2;
	}
	void Build(const int now=1,const int left=1,const int right=n-1)
	{
		if(left==right)
		{
			sgt[now].i1=0;
			sgt[now].i2=1;
			return;
		}
		Build(LEFT);
		Build(RIGHT);
		PushUp(now);
	}
	void Updata(const int place,int opt,const int now=1,const int left=1,const int right=n-1)
	{
		if(place<left||right<place)
		{
			return;
		}
		if(left==right)
		{
			if(opt==1)
			{
				sgt[now].i1=1;
				sgt[now].i2=0;
			}
			if(opt==2)
			{
				sgt[now].i1=0;
				sgt[now].i2=1;
			}
			if(opt==3)
			{
				sgt[now].i1=sgt[now].i2=0;
			}
			return;
		}
		Updata(place,opt,LEFT);
		Updata(place,opt,RIGHT);
		PushUp(now);
	}
	int Query(int opt,const int now=1,const int left=1,const int right=n-1)
	{
		if(left==right)
		{
			if(opt==1&&sgt[now].i1==0)
			{
				return 0;
			}
			if(opt==2&&sgt[now].i2==0)
			{
				return 0;
			}
			return left;
		}
		if(opt==1)
		{
			if(sgt[LSON].i1)
			{
				return Query(opt,LEFT);
			}
			else
			{
				return Query(opt,RIGHT);
			}
		}
		if(opt==2)
		{
			if(sgt[LSON].i2)
			{
				return Query(opt,LEFT);
			}
			else
			{
				return Query(opt,RIGHT);
			}
		}
	}
	int Query2(const int now=1,const int left=1,const int right=n-1)
	{
		if(left==right)
		{
			return left;
		}
		if(sgt[LSON].i1||sgt[LSON].i2)
		{
			return Query2(LEFT);
		}
		else
		{
			return Query2(RIGHT);
		}
	}
}
void Work()
{
	int cnt=0;
	scanf("%d%d%d",&n,&m,&k);
	REP(i,1,n)
	{
		st_top[i]=st_low[i]=0;
		top[i]=0;
	}
	REP(i,1,k)
	{
		last[i]=m+1;
		a_id[i]=0;
		sum[i]=0;
		c_st[i]=0;
	}
	p=0;
	REP(i,1,m)
	{
		scanf("%d",&a[i]);
		st0[i]=0;
		sum[a[i]]+=1;
		if(p==k)
		{
			st0[last[a[i]]]=1;
			st0[i]=2;
		}
		last[a[i]]=i;
		if(sum[a[i]]%2==1)
		{
			++p;
		}
		else
		{
			--p;
		}
	}
	if(k==2*n-2)
	{
		REP(i,1,m)
		{
			int q=(a[i]+1)>>1;
			if(st_top[q]==a[i])
			{
				opt[++cnt]=1;
				u[cnt]=q;
				st_top[q]=0;
				continue;
			}
			if(st_low[q]==a[i])
			{
				opt[++cnt]=1;
				u[cnt]=n;
				opt[++cnt]=2;
				u[cnt]=n;
				v[cnt]=q;
				st_low[q]=st_top[q];
				st_top[q]=0;
				continue;
			}
			if(st_low[q])
			{
				opt[++cnt]=1;
				u[cnt]=q;
				st_top[q]=a[i];
			}
			else
			{
				opt[++cnt]=1;
				u[cnt]=q;
				st_low[q]=a[i];
			}
		}
		printf("%d\n",cnt);
		REP(i,1,cnt)
		{
			if(opt[i]==1)
			{
				printf("%d %d\n",1,u[i]);
			}
			else
			{
				printf("%d %d %d\n",2,u[i],v[i]);
			}
		}
		return;
	}
	SGT::Build();
	REP(i,1,n)
	{
		top[i]=0;
	}
	int now=0;
	int pl=0;
	while(++now<=m)
	{
		if(st0[now]==1)
		{
			pl=SGT::Query(2);
			st_low[pl]=a[now];
			top[pl]=1;
			opt[++cnt]=1;
			u[cnt]=pl;
			SGT::Updata(pl,1);
			c_st[a[now]]=pl;
			continue;
		}
		if(st0[now+1]==2)
		{
			if(top[pl]==2)
			{
				opt[++cnt]=1;
				u[cnt]=pl;
				opt[++cnt]=1;
				u[cnt]=n;
				opt[++cnt]=2;
				u[cnt]=n;
				v[cnt]=pl;
				c_st[a[now]]=pl;
				c_st[a[now+1]]=0;
				st_low[pl]=st_top[pl];
				st_top[pl]=a[now];
				++now;
			}
			else
			{
				st_low[pl]=0;
				st_top[pl]=0;
				opt[++cnt]=1;
				u[cnt]=pl;
				top[pl]=0;
				SGT::Updata(pl,2);
			}
			continue;
		}
		if(!c_st[a[now]])
		{
			int p=SGT::Query2();
			c_st[a[now]]=p;
			opt[++cnt]=1;
			u[cnt]=p;
			if(top[p])
			{
				++top[p];
				st_top[p]=a[now];
				SGT::Updata(p,3);
			}
			else
			{
				++top[p];
				SGT::Updata(p,1);
			}
		}
		else
		{
			if(a[now]==st_top[c_st[a[now]]])
			{
				--top[c_st[a[now]]];
				st_top[c_st[a[now]]]=0;
				SGT::Updata(c_st[a[now]],1);
				opt[++cnt]=1;
				u[cnt]=c_st[a[now]];
				c_st[a[now]]=0;
			}
			else
			{
				--top[c_st[a[now]]];
				st_low[c_st[a[now]]]=st_top[c_st[a[now]]];
				SGT::Updata(c_st[a[now]],2-top[c_st[a[now]]]);
				opt[++cnt]=1;
				u[cnt]=n;
				opt[++cnt]=2;
				u[cnt]=n;
				v[cnt]=c_st[a[now]];
				c_st[a[now]]=0;
			}
		}
	}
	printf("%d\n",cnt);
	REP(i,1,cnt)
	{
		if(opt[i]==1)
		{
			printf("%d %d\n",1,u[i]);
		}
		else
		{
			printf("%d %d %d\n",2,u[i],v[i]);
		}
	}
}
int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int t;
	scanf("%d",&t);
	REP(i,1,t)
	{
		Work();
	}
	return 0;
}
