#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
int n,m,k,a[N],cp[N],pos[N];
int buc[N],sp;
int stk[N][4],top[N];
set<int> t0,t1,t2,t3;
struct node {
	int x,y,z;
};
vector<node> ans;
int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-48;
	return x*f;
}
int ask(int x,int v) {
	if(stk[x][1]==v) return 1;
	if(stk[x][2]==v) return 2;
	return 3;
}
void add(int x) {
	ans.push_back({1,x});
}
void del(int x) {
	ans.push_back({1,x});
}
void del(int x,int y) {
	ans.push_back({1,y});
	ans.push_back({2,x,y});
}
int main() {
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int T=read();
	for(;T--;) {
		n=read(); m=read(); k=read();
		for(int i=1;i<=m;i++) {
			a[i]=read();
		}
		for(int i=1;i<=m;i++) {
			if(!buc[a[i]]) buc[a[i]]=i;
			else {
				cp[buc[a[i]]]=i; cp[i]=buc[a[i]]; buc[a[i]]=0;
			}
		}
		for(int i=1;i<=m;i++) pos[i]=0;
		for(int i=1;i<=n;i++) {
			top[i]=0; stk[i][0]=stk[i][1]=stk[i][2]=stk[i][3]=0;
		}
		ans.clear();
		t0.clear(); t1.clear(); t2.clear(); t3.clear();
		set<pair<int,int> > st[4];
		for(int i=1;i<=n;i++) t0.insert(i);
		for(int i=1;i<=m;i++) {
			if(cp[i]>i) {
				if(t0.size()>1) {
					int x=*t0.begin();
					t0.erase(x); t1.insert(x);
					stk[x][++top[x]]=i; pos[i]=x;
					st[1].insert({cp[i],x});
					add(x);
				}
				else {
					if(t1.size()>0) {
						int x=*t1.begin();
						if(sp==x) x=*(++t1.begin());
						t1.erase(x); t2.insert(x);
						stk[x][++top[x]]=i; pos[i]=x;
						st[2].insert({cp[i],x});
						add(x);
					}
					else {
						int v1=(*st[1].begin()).first,p1=(*st[1].begin()).second;
						int v2=(*st[2].begin()).first,p2=(*st[2].begin()).second;
						if(v1<v2||cp[stk[p1][2]]>v1) {
							int x=p1;
							t2.erase(x); t3.insert(x);
							stk[x][++top[x]]=i; pos[i]=x;
							st[3].insert({cp[i],x});
							add(x);
						}
						else {
							sp=p1;
							int x=*t0.begin();
							t0.erase(x); t1.insert(x);
							stk[x][++top[x]]=i; pos[i]=x;
							st[1].insert({cp[i],x});
							add(x);
						}
					}
				}
			}
			else {
				int x=pos[cp[i]],y=ask(x,cp[i]);
				if(y==1) {
					if(top[x]==1) {
						t1.erase(x); t0.insert(x);
						top[x]--;
						st[1].erase({i,x});
						del(x);
						if(sp==x) sp=0;
					}
					else {
						int xx=*t0.begin();
						if(top[x]==3) {
							st[1].erase({cp[stk[x][1]],stk[x][1]});
							st[2].erase({cp[stk[x][2]],stk[x][2]});
							st[1].insert({cp[stk[x][2]],stk[x][2]});
							stk[x][1]=stk[x][2];
							st[3].erase({cp[stk[x][3]],stk[x][3]});
							st[2].insert({cp[stk[x][3]],stk[x][3]});
							stk[x][2]=stk[x][3];
							t3.erase(x); t2.insert(x);
						}
						else if(top[x]==2) {
							st[1].erase({cp[stk[x][1]],stk[x][1]});
							st[2].erase({cp[stk[x][2]],stk[x][2]});
							st[1].insert({cp[stk[x][2]],stk[x][2]});
							stk[x][1]=stk[x][2];
							t2.erase(x); t1.insert(x);
						}
						else if(top[x]==1) {
							st[1].erase({cp[stk[x][1]],stk[x][1]});
							t1.erase(x);
						}
						top[x]--;
						del(x,xx);
					}
				}
				else if(y==2) {
					st[2].erase({cp[stk[x][2]],stk[x][2]});
					t2.erase(x); t1.insert(x);
					top[x]--; del(x);
				}
				else {
					st[3].erase({cp[stk[x][3]],stk[x][3]});
					t3.erase(x); t2.insert(x);
					top[x]--; del(x);
				}
			}
		}
		printf("%d\n",ans.size());
		for(auto x:ans) {
			if(x.x==1) printf("1 %d\n",x.y);
			else printf("2 %d %d\n",x.y,x.z);
		}
	}
	return 0;
}
