#include<bits/stdc++.h>
using namespace std;
const int N=2e6+7;
const int M=6e2+7;
int T,n,m,k,x[N],c[N],s[N][4],vis[M];
int read(){
	char c;
	int x=0;
	while(!isdigit(c=getchar()));
	while(isdigit(c)){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x;
}
struct opt{
	int id,x,y;
	opt(int id=0,int x=0,int y=0):id(id),x(x),y(y){}
}o[N<<1];
int tot;
bool IsTop(int x){
	int t=vis[x];
	return s[t][c[t]]==x;
}
void solve(){
	n=read();
	m=read();
	k=read();
	tot=0;
	for(int i=1;i<=m;++i)
		x[i]=read();
	set<int>st[4];
	for(int i=1;i<=n;++i)
		st[0].insert(i);
	int posl=0,posr=0;
	for(int i=1;i<=m;++i){
		if(vis[x[i]]){
			int t=vis[x[i]];
			if(IsTop(x[i])){
				o[++tot]=opt(1,t);
				st[c[t]].erase(t);
				s[t][c[t]--]=0;
				st[c[t]].insert(t);
				vis[x[i]]=0;
			}
			else{
				int p=*st[0].begin();
				o[++tot]=opt(1,p);
				o[++tot]=opt(2,t,p);
				st[c[t]].erase(t);
				for(int j=1;j<c[t];++j)
					s[t][j]=s[t][j+1];
				s[t][c[t]--]=0;
				st[c[t]].insert(t);
				vis[x[i]]=0;
			}
		}
		else{
			if(x[i]==x[i+1]){
				int p;
				if(!st[0].empty())
					p=*st[0].begin();
				else
					p=*st[1].begin();
				o[++tot]=opt(1,p);
				st[c[p]].erase(p);
				s[p][++c[p]]=x[i];
				vis[x[i]]=p;
				st[c[p]].insert(p);
			}
			else{
				if(!st[0].empty()){
					if(st[0].size()>1u){
						int p=*st[0].begin();
						o[++tot]=opt(1,p);
						st[c[p]].erase(p);
						s[p][++c[p]]=x[i];
						vis[x[i]]=p;
						st[c[p]].insert(p);
					}
					else{
						if(!st[1].empty()){
							int p=*st[1].begin();
							o[++tot]=opt(1,p);
							st[c[p]].erase(p);
							s[p][++c[p]]=x[i];
							vis[x[i]]=p;
							st[c[p]].insert(p);
						}
						else{
							if(IsTop(x[i+1])){
								int p=*st[0].begin();
								o[++tot]=opt(1,p);
								st[c[p]].erase(p);
								s[p][++c[p]]=x[i];
								vis[x[i]]=p;
								st[c[p]].insert(p);
								posl=p;
								posr=tot;
							}
							else{
								int p=vis[x[i+1]];
								o[++tot]=opt(1,p);
								st[c[p]].erase(p);
								s[p][++c[p]]=x[i];
								vis[x[i]]=p;
								st[c[p]].insert(p);
							}
						}
					}
				}
				else{
					if(IsTop(x[i+1])){
						int p;
						auto it=st[1].begin();
						if(*it==posl)
							++it;
						p=*it;
						o[++tot]=opt(1,p);
						st[c[p]].erase(p);
						s[p][++c[p]]=x[i];
						vis[x[i]]=p;
						st[c[p]].insert(p);
					}
					else{
						int p;
						auto it=st[1].begin();
						if(*it==posl)
							++it;
						p=*it;
						o[++tot]=opt(1,p);
						st[c[p]].erase(p);
						s[p][++c[p]]=x[i];
						vis[x[i]]=p;
						st[c[p]].insert(p);
						p=vis[x[i+1]];
						o[posr].x=p;
						st[c[p]].erase(p);
						s[p][++c[p]]=s[posl][c[posl]];
						vis[s[posl][c[posl]]]=p;
						st[c[p]].insert(p);
						st[c[posl]].erase(posl);
						s[posl][c[posl]--]=0;
						st[c[posl]].insert(posl);
					}
				}
			}
		}
	}
	printf("%d\n",tot);
	for(int i=1;i<=tot;++i){
		if(o[i].id==1)
			printf("1 %d\n",o[i].x);
		else
			printf("2 %d %d\n",o[i].x,o[i].y);
	}
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	T=read();
	while(T--)
		solve();
	return 0;
}