#include<bits/stdc++.h>
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define ll long long
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9') { if(c=='-') f=-1;c=getchar(); }
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^'0'),c=getchar();
	return x*f;
}
const int N=305,M=2e6+5;
struct ANS{
	int op,x,y;
}ans[M],res[M];
int tot,Tot;
int n,m,k,a[N];
struct node{
	int l[N],r[N],siz[N];
	vector<int>st[N];
	void init(){
		Tot=0;
		for(int i=1;i<=n;i++) st[i].clear(),st[i].resize(siz[i]+2),l[i]=1,r[i]=0;
	}
	void init2(){
		Tot=0;
		for(int i=1;i<=n;i++) l[i]=1,r[i]=0;
	}
	void push(int x,int v){
		if(v!=st[x][r[x]]) st[x][++r[x]]=v;
		else r[x]--;
		res[++Tot]={1,x,0};
	}
	int size(int x){
		return r[x]-l[x]+1;
	}
	int merge(int x,int y){
		if(st[x][l[x]]!=st[y][l[y]]) return 0;
		l[x]++,l[y]++;
		res[++Tot]={2,x,y};
		return 1;
	}
	int get(int x){
		return st[x][r[x]];
	}
	int getbot(int x){
		return st[x][l[x]];
	}
	int empty(){
		for(int i=1;i<=n;i++) if(r[i]-l[i]+1!=0) return 0;
		return 1;
	}
}S;
int cnt[N];
void print(){
	printf("%d\n",tot);
	for(int i=1;i<=tot;i++){
		if(ans[i].op==1) printf("%d %d\n",ans[i].op,ans[i].x);
		else printf("%d %d %d\n",ans[i].op,ans[i].x,ans[i].y);
	}
}
void sub1(){
	for(int i=1;i<=m;i++) cnt[a[i]]++;
	for(int i=1;i<n;i++) S.siz[i]=cnt[i]+cnt[i+n-1];
	S.siz[n]=10;
	S.init();
	for(int i=1;i<=m;i++){
		int id=a[i];
		id=((id-1)%(n-1)+1);
		if(S.size(id)==0) S.push(id,a[i]),ans[++tot]={1,id,0};
		else if(S.size(id)==1) S.push(id,a[i]),ans[++tot]={1,id,0};
		else{
			if(a[i]==S.get(id)) S.push(id,a[i]),ans[++tot]={1,id,0};
			else{
				S.push(n,a[i]);
				ans[++tot]={1,n,0};
				S.merge(id,n);
				ans[++tot]={2,id,n};
			}
		}
	}
	if(S.empty()) print();
	else cerr<<"DDDD";
}
int pos[605];
void sub2(){
	for(int i=2;i<=n;i++) pos[i]=i-1;
	for(int i=n+1;i<=k;i++) pos[i]=i-n;
	pos[1]=n;
	for(int i=1;i<=m;i++) cnt[a[i]]++;
	for(int i=1;i<n;i++) S.siz[i]=cnt[i+1]+cnt[i+n];
	S.siz[n]=10;
	S.init();
	for(int t=1;t<=k;t++){
		for(int i=1;i<=m;i++){
			int id=pos[a[i]];
			if(id==n) S.push(id,a[i]);
			else{
				if(S.size(n)==1) S.push(id,a[i]);
				else{
					if(S.size(id)<=1) S.push(id,a[i]);
					else if(S.getbot(id)==a[i]) S.push(n,a[i]),S.merge(id,n);
				}
			}
		}
		if(S.empty()){
			for(int i=1;i<=Tot;i++) ans[i]=res[i];
			tot=Tot;
			print();
			return;
		}
		S.siz[pos[t+1]]=S.siz[pos[t+1]]-cnt[t+1]+cnt[t];
		S.init();
		swap(pos[t],pos[t+1]);
	}
}
void sub3(){
	for(int i=1;i<=m;i++) cnt[a[i]]++;
}
int T;
void solve(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=m;i++) a[i]=read();
	if(n==1){
		for(int i=1;i<=m;i++) printf("1 1\n");
		return;
	}
	if(T%10==1) return sub1();
	return sub2();
}
signed main(){
	fre(meow);
	T=read();
	for(int i=1;i<=T;i++) solve();
	return 0;
}
/*
2
2 10 3
1 3 2 1 3 2 3 1 3 1
2 10 3
1 3 2 1 3 2 3 1 3 1

*/
