#include<bits/stdc++.h>
using namespace std;
int T,n,m,k;
struct node{
	int op,s1,s2;
}st[400005];
int v[705][5005];
bool flag=0,qq=0;
int pai[200005],head[705],tail[705],bu;
void dfs(int id,int step){
	if(flag)return;
	for(int i=1;i<n;i++){
		if(tail[i]>=head[i]){
			for(int j=i+1;j<=n;j++){
				if(tail[j]>=head[j]&&v[i][head[i]]==v[j][head[j]]){
					head[i]++;head[j]++;
					st[step].op=2,st[step].s1=i,st[step++].s2=j;
				}
			}
		}
	}
	if(id==m+1){
		for(int i=1;i<=n;i++)if(head[i]>tail[i])flag=1;
		if(flag){
			printf("%d\n",step-1);
			for(int i=1;i<=step;i++){
				if(st[i].op==1){
				printf("1 %d\n",st[i].s1);
				}
			else if(st[i].op==2){
				printf("2 %d %d\n",st[i].s1,st[i].s2);
				}
			}
		}
		return;
	}
	bool ok=0;
	for(int i=1;i<=n;i++){
		
		int len=tail[i]-head[i];
		
		if(len>=0&&v[i][tail[i]]==pai[id]){
		//	cout<<"s";
			ok=1;
			v[i][tail[i]]=0;
			tail[i]--;
			st[step].op=1,st[step].s1=i;
			dfs(id+1,step+1);
		}
		
	}
	if(ok==0)for(int i=1;i<=n;i++){
		
		int len=tail[i]-head[i];
		if(len<=0){
			st[step].op=1,st[step].s1=i;
			v[i][++tail[i]]=pai[id];
			dfs(id+1,step+1);
		}
		
	}
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=m;i++)scanf("%d",&pai[i]);
		for	(int i=1;i<=n;i++){
			head[i]=1,tail[i]=0;
		}
		flag=0;
		dfs(1,1);
		
	}
	return 0;
}