#include <bits/stdc++.h>
using namespace std;
constexpr int max_n=600,max_m=4000000;
int a[max_m+1],nxt[max_m+1];
int pos[max_n*2];
vector<int>stk[max_n+1];
int tl[max_n+1];
vector<pair<int,int> >opt;
vector<int>sing,uf,df,emp;
void ins(const int u){
	const int s=stk[u].size()-tl[u];
	if(!s)
		emp.emplace_back(u);
	if(s==1)
		sing.emplace_back(u);
	if(s==2){
		if(nxt[stk[u][tl[u]+1]]<=nxt[stk[u][tl[u]]])
			uf.emplace_back(u);
		else
			df.emplace_back(u);
	}
}
void pop_back(const int u){
	// fprintf(stderr,"pop_back %d\n",u);
	stk[u].pop_back();
	ins(u);
}
void pop_front(const int u){
	++tl[u];
	ins(u);
}
void flsh(){
	for(; !emp.empty(); emp.pop_back()){
		const int t=emp.back();
		if(stk[t].size()==tl[t])
			break;
	}
	for(; !sing.empty(); sing.pop_back()){
		const int t=sing.back();
		if(stk[t].size()==tl[t]+1)
			break;
	}
	for(; !uf.empty(); uf.pop_back()){
		const int t=uf.back();
		if(stk[t].size()==tl[t]+2&&nxt[stk[t][tl[t]+1]]<=nxt[stk[t][tl[t]]])
			break;
	}
	for(; !df.empty(); df.pop_back()){
		const int t=df.back();
		if(stk[t].size()==tl[t]+2&&nxt[stk[t][tl[t]+1]]>nxt[stk[t][tl[t]]])
			break;
	}
}
void erase(const int v){
	const int p=pos[v];
	pos[v]=0;
	// fprintf(stderr,"%d: %d  %zd\n",v,p,opt.size());
	if(a[stk[p].back()]==v){
		// fprintf(stderr,"A\n");
		opt.emplace_back(0,p);
		pop_back(p);
	}
	else{
		// fprintf(stderr,"B %d %zd %d\n",p,stk[p].size(),tl[p]);
		// for(int i=tl[p]; i<stk[p].size(); ++i)
		// 	fprintf(stderr," %d(%d %d)",stk[p][i],a[stk[p][i]],nxt[stk[p][i]]);
		// fprintf(stderr,"\n");
		if(!emp.size()||a[stk[p][tl[p]]]!=v)
			fprintf(stderr,"ERROR");
		// fprintf(stderr,"AF\n");
		const int u=emp.back();
		// fprintf(stderr,"AD\n");
		opt.emplace_back(0,u);
		opt.emplace_back(p,u);
		pop_front(p);
	}
}
void test(){
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1; i<=m; ++i)
		scanf("%d",a+i);
	opt.clear();
	for(int i=1; i<=n; ++i)
		tl[i]=0,stk[i].clear();
	for(int i=1; i<=k; ++i)
		pos[i]=m+1;
	for(int i=m; i; --i){
		nxt[i]=pos[a[i]];
		pos[a[i]]=i;
	}
	for(int i=1; i<=k; ++i)
		pos[i]=0;
	sing.clear(),uf.clear(),df.clear(),emp.clear();
	for(int i=1; i<=n; ++i)
		emp.emplace_back(i);
	for(int i=1; i<=m; ++i){
		// fprintf(stderr,"deal %d(%d %d)\n",i,a[i],pos[a[i]]);
		flsh();
		if(pos[a[i]]){
			erase(a[i]);
			continue;
		}
		if(sing.size()){
			const int u=sing.back();
			const int oth=stk[u].back();
			opt.emplace_back(0,u);
			stk[u].emplace_back(i);
			pos[a[i]]=u;
			sing.pop_back();
			if(nxt[i]<=nxt[oth])
				uf.emplace_back(u);
			else
				df.emplace_back(u);
			continue;
		}
		if(emp.size()>1){
			const int u=emp.back();
			opt.emplace_back(0,u);
			emp.pop_back();
			stk[u].emplace_back(i);
			pos[a[i]]=u;
			sing.emplace_back(u);
			continue;
		}
		if(df.size()){
			const int u=df.back();
			opt.emplace_back(0,u);
			df.pop_back();
			stk[u].emplace_back(i);
			pos[a[i]]=u;
			continue;
		}
		const int u=emp.back();
		opt.emplace_back(0,u);
		emp.pop_back();
		stk[u].emplace_back(i);
		pos[a[i]]=u;
		sing.emplace_back(u);
		int empp=0,j=i+1;
		for(; j<=m; ++j){
			const int p=pos[a[j]];
			if(a[stk[p][tl[p]]]==a[j]){
				empp=p;
				break;
			}
		}
		for(; ++i<j; ){
			flsh();
			if(!sing.empty()&&sing.back()==empp)
				sing.pop_back();
			flsh();
			// fprintf(stderr,"dealx %d(%d %d)\n",i,a[i],pos[a[i]]);
			if(pos[a[i]])
				erase(a[i]);
			else{
				// fprintf(stderr," sing.size() = %zd\n",sing.size());
				const int u=sing.back();
				// fprintf(stderr," %d\n",u);
				const int oth=stk[u].back();
				opt.emplace_back(0,u);
				stk[u].emplace_back(i);
				pos[a[i]]=u;
				sing.pop_back();
				if(nxt[i]<=nxt[oth])
					uf.emplace_back(u);
				else
					df.emplace_back(u);
				// fprintf(stderr,"asdf\n");
			}
		}
		--i;
	}
	printf("%zd\n",opt.size());
	for(const pair<int,int>&p:opt)
		if(p.first)
			printf("2 %d %d\n",p.first,p.second);
		else
			printf("1 %d\n",p.second);
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int t;
	for(scanf("%d",&t); t; test(),--t);
	return 0;
}