#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int d=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){d=(d<<3)+(d<<1)+c-'0';c=getchar();}
	return d;
}
const int N=2e6+5;
struct node{
	int op,s1,s2;
}ans[N*2];
int n,m,k;
int a[N],syc[N],xyc[N];
int s[601],latest[601],newest[601],cnt;
int sta[301][3],nxt[301][3],head[2];
void output(){
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++){
		printf("%d ",ans[i].op);
		if(ans[i].op==1)
			printf("%d\n",ans[i].s1);
		else
			printf("%d %d\n",ans[i].s1,ans[i].s2);
	}
}
void deal1(){
	cnt=0;
	for(int i=1;i<=m;i++){
		int x=(a[i]-1)%(n-1)+1;
		cout<<x<<" "<<a[i]<<" "<<sta[x][0]<<endl;
		if(sta[x][0]==a[i]){
			ans[++cnt].op=1;
			ans[cnt].s1=n;
			ans[++cnt].op=2;
			ans[cnt].s1=x;
			ans[cnt].s2=n;
			sta[x][0]=sta[x][1];
			sta[x][1]=0;
		}
		else{
			ans[++cnt].op=1;
			ans[cnt].s1=x;
			if(!sta[x][0])
				sta[x][0]=a[i];
			else if(sta[x][1]==a[i])
				sta[x][1]=0;
			else
				sta[x][1]=a[i];
		}
	}
	output();
}
void deal2(){
	cnt=0;
	memset(latest,0,sizeof(latest));
	int byz=n;
	head[0]=head[1]=1;
	for(int i=1;i<n;i++)
		nxt[i][0]=nxt[i][1]=i+1;
	for(int i=1;i<=m;i++){
		if(latest[a[i]]){
			int x=latest[a[i]];
			latest[a[i]]=0;
			if(a[i]==sta[x][1]){
				ans[++cnt].op=1;
				ans[cnt].s1=x;
				sta[x][1]=0;
				nxt[x][1]=head[1];
				head[1]=x;
			}
			else if(a[i]==sta[x][0]){
				ans[++cnt].op=1;
				ans[cnt].s1=byz;
				if(sta[byz][0]==a[i]){
					sta[byz][0]=0;
				}
				else{
					ans[++cnt].op=2;
					ans[cnt].s1=x;
					ans[cnt].s2=byz;
					sta[x][0]=sta[x][1];
					sta[x][1]=sta[x][2];
					sta[x][2]=0;
					if(sta[x][0]){
						if(!sta[x][1]){
							nxt[x][1]=head[1];
							head[1]=nxt[x][1];
						}
					}
					else{
						nxt[x][0]=head[0];
						head[0]=nxt[x][0];
					}
				}
			}
			else{
				ans[++cnt].op=1;
				ans[cnt].s1=x;
				sta[x][2]=0;
			}
		}
		else{
			newest[a[i]]=xyc[i];
			if(head[0]!=byz){
				ans[++cnt].op=1;
				ans[cnt].s1=head[0];
				latest[a[i]]=head[0];
				sta[head[0]][0]=a[i];
				head[0]=nxt[head[0]][0];
			}
			else if(head[1]!=byz){
				ans[++cnt].op=1;
				ans[cnt].s1=head[1];
				latest[a[i]]=head[1];
				sta[head[1]][1]=a[i];
				head[1]=nxt[head[1]][1];
			}
			else{
				bool bl=true;
				for(int j=1;j<=n;j++){
					if(j==byz)
						continue;
					if(newest[sta[j][0]]<newest[sta[j][1]]){
						bl=false;
						ans[++cnt].op=1;
						ans[cnt].s1=j;
						latest[a[i]]=j;
						sta[j][2]=a[i];
						break;
					}
				}
				if(bl){
					ans[++cnt].op=1;
					ans[cnt].s1=byz;
					latest[a[i]]=byz;
					sta[byz][0]=a[i];
					for(int i=1;i<=n;i++){
						if(newest[sta[i][0]]<newest[sta[byz][0]])
							byz=i;
					}
				}
			}
		}
	}
	output();
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int t=read();
	for(int ii=1;ii<=t;ii++){
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++){
			a[i]=read();
			if(!s[a[i]]){
				s[a[i]]=++cnt;
			}
			a[i]=s[a[i]];
			syc[i]=latest[a[i]];
			xyc[latest[a[i]]]=i;
			latest[a[i]]=i;
		}
		if(k==n*2-2){
			deal1();
			continue;
		}
		deal2();
	}
	return 0;
}
