#include<bits/stdc++.h>
#define maxn 605
#define ll long long 
#define ull unsigned long long
#define put() putchar('\n')
using namespace std;
inline void read(int &x) {
	x=0;char ch=getchar();int f=1;
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	x*=f;
}
int T,n,m,k;
int vis[maxn],h[maxn],pre[maxn],a[2000005];
struct yyy{
	int op,x,y;
}Ans[2000005];
int tot,opp[maxn];
inline void solve1(void) {
	int i;
	for (i=1;i<=m;i++) {
		int x=(a[i]+1)/2;
		if (vis[a[i]]==1) {
			Ans[++tot].op=1,Ans[tot].x=n;
			Ans[++tot].op=2,Ans[tot].x=n,Ans[tot].y=x;
			if (vis[opp[a[i]]]) vis[opp[a[i]]]=1;
			vis[a[i]]=0;
		} 
		else if (vis[a[i]]==2) {
			Ans[++tot].op=1,Ans[tot].x=x;
		}
		else if (vis[a[i]]==0) {
			vis[a[i]]=1+vis[opp[a[i]]];
			Ans[++tot].op=1,Ans[tot].x=x;
		}
	}
	printf("%d\n",tot);
	for (i=1;i<=tot;i++) {
		if (Ans[i].op==1) printf("%d %d\n",Ans[i].op,Ans[i].x);
		else printf("%d %d %d\n",Ans[i].op,Ans[i].x,Ans[i].y);
	}
}
int num[maxn],cnt,s[maxn][2],now;
inline void update1(int i) {//del 1
	int x=vis[a[i]];
	Ans[i*2-1].op=1,Ans[i*2-1].x=now;
	Ans[i*2].op=2,Ans[i*2].x=now,Ans[i*2].y=x;
	vis[a[i]]=h[a[i]]=0;s[x][0]=s[x][1],h[s[x][1]]=1;
	num[x]--;
}
inline void update2(int i) {//del 2
	int x=vis[a[i]];
	Ans[i*2-1].op=1,Ans[i*2-1].x=x;
	vis[a[i]]=h[a[i]]=0;s[x][1]=0,num[x]--;
}
inline void add1(int j,int i) {
	vis[a[i]]=j;num[j]++;h[a[i]]=1;s[j][0]=a[j];
	Ans[i*2-1].op=1,Ans[i*2-1].x=j;
}
inline void add2(int j,int i){
	vis[a[i]]=j;num[j]++;h[a[i]]=2;s[j][1]=a[j];
	Ans[i*2-1].op=1,Ans[i*2-1].x=j;
}
inline void add(int j,int i) {
	if (num[j]==0) add1(j,i);
	else add2(j,i); 
}
int gg[maxn];
inline void solve2(void) {
	int i,j,l,cnt=0,o,x;now=n;
	for (i=1;i<=n;i++) num[i]=0,s[i][0]=s[i][1]=0,vis[i]=h[i]=0;
	for (i=1;i<=m;i++) {
		if (vis[a[i]]) {
			if (h[a[i]]==1) update1(i);
			else update2(i);
		}
		else {
			for (j=1;j<=n;j++) if (num[j]==1) {add2(j,i);break;}
			if (vis[a[i]]) continue;
			for (j=1;j<=n;j++) if (num[j]==0&&j!=now) {add1(j,i);break;}
			if (vis[a[i]]) continue;
			if (a[i+1]==a[i]) {
				Ans[i*2-1].op=1,Ans[i*2-1].x=now;
				Ans[i*2+1].op=1,Ans[i*2+1].x=now;
				continue;
			}
			int tmp1,l;
			for (j=1;j<=k;j++) gg[j]=vis[j];
			for (j=i+1;j<=m;j++) {
				if (h[a[j]]==1) {
					int x=vis[a[j]];
					update1(j);
					l=j;tmp1=vis[a[l]];
					break;
				}
				else if (a[i]==a[j]) ;
				else {
					if (h[a[j]]==2) update2(j);
					else add2(gg[a[j]],j);
				} 
			}
			add2(x,vis[l]);
			for (j=i+1;j<l;j++) if (a[i]==a[j]) {
				if (h[tmp1]==1) add2(tmp1,j);
				else update2(j);
			}
			i=l; 
		}
	}
	for (i=1;i<=2*m;i++) if (Ans[i].op) tot++;
	printf("%d\n",tot);
	for (i=1;i<=2*m;i++) {
		if (Ans[i].op==1) printf("%d %d\n",Ans[i].op,Ans[i].x);
		if (Ans[i].op==2) printf("%d %d %d\n",Ans[i].op,Ans[i].x,Ans[i].y);
	}
} 
inline void solve(void) {
	int i;
	read(n);read(m);read(k);tot=0;
	for (i=1;i<=n;i+=2) opp[i]=i+1,opp[i+1]=i,vis[i]=0;
	for (i=1;i<=m;i++) read(a[i]);
	if (k==2*n-2) solve1();
	else {
		solve2();
	}
}
signed main(void) {
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	read(T);while (T--) solve();
	return 0;
}