#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=3e2+10,M=2e6+10,K=N*2;
int T,n,m,k,a[M],nex[M],vis[K],now[K];
struct ops{int op,x,y;};
vector<ops>ans;
set<int>s;
int oth(int x){
	return x&1?x+1:x-1;
}
void op1(int x){
	ans.push_back({1,x,0});
}
void op2(int x,int y){
	ans.push_back({2,x,y});
}
void get(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++)scanf("%d",&a[i]);
	for(int i=1;i<=k;i++)now[i]=0;
	for(int i=m;i>=1;i--){
		if(now[a[i]])nex[i]=now[a[i]],now[a[i]]=0;
		else nex[i]=0,now[a[i]]=i;
	}
	if(k==n*2-2){
		for(int i=1,x;i<=m;i++){
			x=a[i];int y=oth(x),z=(x+1)/2;
			if(vis[x]&&vis[y]){
				if(vis[x]<vis[y]){op1(n);op2(z,n);vis[x]=0;}
				else{op1(z);vis[x]=0;}
			}
			else if(vis[x]){op1(z);vis[x]=0;}
			else{op1(z);vis[x]=i;}
		}
	}
	else if(n==2){
		deque<int>a,b;
		for(int i=1;i<=m;i++){
			int x=::a[i];
				if(!a.empty()&&a.back()==x){
					a.pop_back();
					op1(1);
					continue;
				}else if(!b.empty()&&b.back()==x){
					b.pop_back();
					op1(2);
					continue;
				}
			if(a.empty()&&b.empty()){
				a.push_back(x);
				op1(1);
			}else if(a.size()+b.size()==1){
				int y=a.empty()?b.front():a.front();
				if(nex[y]>nex[x]){
					if(a.empty())b.push_back(x),op1(2);
					else a.push_back(x),op1(1);
				}else{
					if(!a.empty())b.push_back(x),op1(2);
					else a.push_back(x),op1(1);
				}
			}else if(a.size()+b.size()==2){
				if(a.size()==2){
					if(a.front()==x){
						op1(2);op2(1,2);
					}
					else if(a.back()==x){
						op1(1);a.pop_back();
					}else{
						b.push_back(x);
						op1(2);
					}
				}
				else if(b.size()==2){
					if(b.front()==x){
						op1(1);op2(1,2);
					}
					else if(b.back()==x){
						op1(2);b.pop_back();
					}else{
						a.push_back(x);
						op1(1);
					}
				}else{
					if(b.front()==x){
						op1(2);b.pop_back();
					}
					else if(a.front()==x){
						op1(1);a.pop_back();
					}else{
						int p=a.front(),q=b.front();
						if(nex[p]>nex[q]){
							a.push_back(x);
							op1(1);
						}else{
							b.push_back(x);
							op1(2);
						}
					}
				}
			}else{
				if(a.back()==x){
					a.pop_back();
					op1(1);
				}else{
					b.pop_back();
					op1(2);
				}
			}
		}
	}
	else{
		for(int i=1,x;i<=m;i++){
			x=a[i];int y=oth(x),z=(x+1)/2;
			if(vis[x]&&vis[y]){
				if(vis[x]<vis[y]){op1(n);op2(z,n);vis[x]=0;}
				else{op1(z);vis[x]=0;}
			}
			else if(vis[x]){op1(n);op2(z,n);vis[x]=0;}
			else{op1(z);vis[x]=i;}
		}
	}
	printf("%d\n",(int)ans.size());
	for(auto x:ans){
		if(x.op==1){
			printf("1 %d\n",x.x);
		}else{
			printf("2 %d %d\n",x.x,x.y);
		}
	}
}
void clr(){
	ans.clear();for(int i=0;i<=k+1;i++)vis[i]=0;
}
int main(){
	freopen("meow.in","r",stdin);freopen("meow.out","w",stdout);
	for(scanf("%d",&T);T--;clr())get();return 0;
}
