#include<bits/stdc++.h>
using namespace std;
const int N=305,M=2e6+10;
struct node{
	int tim,id;
	bool operator<(const node&y)const{
		return tim<y.tim;
	}
};
int T,n,m,K;
int op[M<<1],cl[M<<1],cr[M<<1],tt;
int a[M],nx[M],ls[N<<1],dt[N<<1],id[N<<1],ti;
int nw[N],vl[N][3],nul[N],sz;
set<node>st;
set<node>::iterator p;
char tc,pc[10],siz;
void getc(int&x){
	x=0;
	while(!isdigit(tc=getchar()));
	while(isdigit(tc))x=(x<<3)+(x<<1)+tc-'0',tc=getchar();
}
void print(int x,char ed){
	while(x)pc[++siz]=(x%10)+'0',x/=10;
	while(siz)putchar(pc[siz--]);
	putchar(ed);
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&K);
		tt=0;
		for(int i=1;i<=K;++i)ls[i]=0,id[i]=0;
		sz=n;
		for(int i=1;i<=n;++i)nul[i]=i,nw[i]=0;
		for(int i=1;i<=m;++i)getc(a[i]),nx[i]=0;
		for(int i=1;i<=m;++i){
			if(i!=m&&a[i]==a[i+1]){
				++i;
				continue;
			}
			if(!ls[a[i]])ls[a[i]]=i;
			else nx[ls[a[i]]]=i,ls[a[i]]=0;
		}
		for(int i=1;i<=m;++i){
			if(i!=m&&a[i]==a[i+1]){
				op[++tt]=1,cl[tt]=1;
				op[++tt]=1,cl[tt]=1;
				++i;
				continue;
			}
			if(!nx[i]){
				ti=id[a[i]];
				if(vl[ti][1]==a[i]){
					if(nw[ti]==1){
						op[++tt]=1,cl[tt]=ti,--nw[ti];
						p=st.lower_bound((node){dt[vl[ti][1]],ti});
						st.erase(p);
						if(!nw[ti])nul[++sz]=ti;
					}else{
						/*if(!sz)cerr<<"T="<<T<<"\n";
						assert(sz);*/
						op[++tt]=1,cl[tt]=nul[sz];
						op[++tt]=2,cl[tt]=ti,cr[tt]=nul[sz];
						--nw[ti],vl[ti][1]=vl[ti][2];
						st.insert((node){dt[vl[ti][1]],ti});
					}
				}else{
					op[++tt]=1,cl[tt]=ti,--nw[ti];
					st.insert((node){dt[vl[ti][1]],ti});
				}
			}else{
				dt[a[i]]=nx[i];
				p=st.lower_bound((node){nx[i],0});
				if(p!=st.end()){
					ti=(*p).id,id[a[i]]=ti;
					st.erase(p);
					op[++tt]=1,cl[tt]=ti;
					++nw[ti],vl[ti][2]=a[i];
				}else{
					if(sz){
						ti=nul[sz],id[a[i]]=ti,--sz;
						op[++tt]=1,cl[tt]=ti;
						++nw[ti],vl[ti][1]=a[i];
						st.insert((node){nx[i],ti});
					}else{
						--p;
						ti=(*p).id,id[a[i]]=ti;
						st.erase(p);
						op[++tt]=1,cl[tt]=ti;
						++nw[ti],vl[ti][2]=a[i];
					}
				}
			}
		}
		//assert(st.begin()==st.end());
		print(tt,'\n');
		for(int i=1;i<=tt;++i){
			if(op[i]==1)putchar('1'),putchar(' '),print(cl[i],'\n');
			else putchar('2'),putchar(' '),print(cl[i],' '),print(cr[i],'\n');
		}
	}
	return 0;
}
