#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

ll read()
{
	ull n=0; ll f=1; char ch=getchar();
	for(;ch<'0'||'9'<ch;ch=getchar()) if(ch=='-') f=-1;
	for(;'0'<=ch&&ch<='9';ch=getchar()) n=(n<<3)+(n<<1)+(ch^48);
	return f*n;
}

const int N=2e6+5;
const int N2=505;
int n,m,k;
//n-zhan geshu, m-kapai geshu, k-tu'an geshu,
int a[N],op;
struct opr
{
	int op,a,b;
	opr():op(0),a(0),b(0){}
	opr(int op_,int a_):op(op_),a(a_){}
	opr(int op_,int a_,int b_):op(op_),a(a_),b(b_){}
}ans[N];
void output()
{
	printf("%d\n",op);
	for(int i=1;i<=op;i++)
	{
		if(ans[i].op==1) printf("%d %d\n",ans[i].op,ans[i].a);
		else             printf("%d %d %d\n",ans[i].op,ans[i].a,ans[i].b);
	}
}

namespace sub1
{
int flag[N2][3],cnt[N2][3];
//flag[i][1] di; flag[i][2] ding
void solve()
{
	memset(flag,0,sizeof(flag));
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=m;i++)
	{
		int q=a[i]%(n-1)+1;
		if(flag[q][1]==a[i]&&flag[q][2]==0)
		{
			ans[++op]=opr(1,q);
			--cnt[q][1];
			if(cnt[q][1]==0) flag[q][1]=0;
		}
		else if(flag[q][1]==a[i]&&flag[q][2]!=0)
		{
			ans[++op]=opr(1,n);
			ans[++op]=opr(2,q,n);
			--cnt[q][1];
			if(cnt[q][1]==0)
			{
				flag[q][1]=0;
				swap(flag[q][1],flag[q][2]);
				swap(cnt[q][1],cnt[q][2]);
			}
		}
		else if(flag[q][1]==0)
		{
			ans[++op]=opr(1,q);
			flag[q][1]=a[i]; cnt[q][1]=1;
		}
		else if(flag[q][2]==a[i]) 
		{
			ans[++op]=opr(1,q);
			flag[q][2]=cnt[q][2]=0;
		}
		else //flag[q][1]!=a[i]
		{
			ans[++op]=opr(1,q);
			flag[q][2]=a[i]; cnt[q][2]=1;
		}
	}
}
}

void Solve(int type)
{
	n=read(),m=read(),k=read(),op=0;
	for(int i=1;i<=m;i++) a[i]=read();
	if(k<=2*n-2 || type==1) sub1::solve();
	output();
}

#define FILESIO 2
int main()
{
  #ifdef FILESIO
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
  #endif
    
    int T=1;
    scanf("%d",&T);
    for(;T--;)
    {
    	Solve(T%10);
	}
  
  #ifdef FILESIO
	fclose(stdin);
	fclose(stdout);
  #endif
    return 0;
}

