#include<bits/stdc++.h>
#define Max(x,y) ((x<y)&&(x=y))
#define Min(x,y) ((x>y)&&(x=y))
using namespace std;

const int M=2e6+5;

inline int read()
{
	int x=0,f=1;static char ch;
	while(ch=getchar(),ch<48)if(ch==45)f=0;
	do x=(x<<1)+(x<<3)+(ch^48);
	while(ch=getchar(),ch>=48);
	return f?x:-x;
}

int n,m,k,a[M],op[M],ch[M][2];

namespace P15
{
	deque<int> q;
	void solve()
	{
		while(!q.empty())q.pop_back();
		int cnt=0;
		for(int i=1;i<=m;i++)
		{
			if(q.empty()||a[i]!=q.front())
			{
				if(!q.empty()&&(q.back()==a[i]))q.pop_back();
				else q.push_back(a[i]);
				op[++cnt]=1,ch[cnt][0]=1;
			}
			else
			{
				q.pop_front();
				op[++cnt]=2,ch[cnt][0]=1,ch[cnt][1]=2;
			}
		}
		printf("%d\n",cnt);
		for(int i=1;i<=cnt;i++)
		{
			if(op[i]==1)printf("1 %d\n",ch[i][0]);
			else printf("2 %d %d\n",ch[i][0],ch[i][1]);
		}
	}
}
namespace P30
{
	deque<int> q[305];
	void solve()
	{
		for(int i=1;i<=n;i++)q[i].clear();
		int cnt=0;
		for(int i=1;i<=m;i++)
		{
			int to=(a[i]+1)/2;
			if(q[to].empty())
			{
				q[to].push_back(a[i]);
				op[++cnt]=1,ch[cnt][0]=to;
			}
			else if(q[to].front()==a[i])
			{
				q[to].pop_front();
				op[++cnt]=2,ch[cnt][0]=to,ch[cnt][1]=n;
			}
			else if(q[to].back()==a[i])
			{
				q[to].pop_back();
				op[++cnt]=1,ch[cnt][0]=to;
			}
			else
			{
				q[to].push_back(a[i]);
				op[++cnt]=1,ch[cnt][0]=to;
			}
		}
		printf("%d\n",cnt);
		for(int i=1;i<=cnt;i++)
		{
			if(op[i]==1)printf("1 %d\n",ch[i][0]);
			else printf("2 %d %d\n",ch[i][0],ch[i][1]);
		}
	}
}

int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	
	int T=read();
	for(int cas=1;cas<=T;cas++)
	{
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++)a[i]=read();
		
		if(n==2&&k==3)P15::solve();
		else if(k==2*n-2)P30::solve();
		else ;
	}
	
	return 0;
}
/*
2
2 10 3
1 2 3 2 1 2 1 3 2 1
2 6 3
1 2 3 2 1 3

2
3 8 4
1 2 3 4 2 1 3 4
4 16 6
1 2 6 5 1 3 2 6 3 4 1 5 1 4 3 3
*/
