#include<bits/stdc++.h>
using namespace std;
#define maxm 2000005
#define maxn 505
int T;
int n,m,k;
deque<int>q[305];
struct ans{
	int op,x,y;
};
ans op[maxm<<1];
int a[maxm];
int vis[maxn<<1];
int tag[maxm];
int cnt=0;
bool searchtop(int id){
	for(int i=1;i<n;i++){
		if(q[i].empty())continue;
		if(q[i].back()==a[id]){
			q[i].pop_back();
			ans temp;
			temp.op=1;temp.x=i;temp.y=i;
			op[++cnt]=temp;
			return 1;
		}
	}
	return 0;
}
bool searchdown(int id){
	for(int i=1;i<n;i++){
		if(q[i].empty())continue;
		if(q[i].front()==a[id]){
			q[i].pop_front();
			ans temp;
			temp.op=1;temp.x=n;temp.y=n;
			op[++cnt]=temp;
			temp.x=i;
			temp.op=2;
			op[++cnt]=temp;
			return 1;
		}
	}
	return 0;
}
void searchdown2(int id){
	for(int i=1;i<n;i++){
		if(q[i].empty())continue;
		if(q[i].front()==a[id]){
			q[i].pop_front();q[i].push_back(a[id-1]);
			ans temp;
			temp.op=1;temp.x=i;temp.y=i;
			op[++cnt]=temp;
			temp.op=1;temp.x=n;temp.y=n;
			op[++cnt]=temp;
			temp.x=i;
			temp.op=2;
			op[++cnt]=temp;
			return ;
		}
	}
	return ;
}
bool searchsize(int id){
	for(int i=1;i<n;i++){
		if(q[i].size()<2)return 0;
	}
	return 1;
}
void pushin(int id){
	if(tag[id]){
		for(int i=1;i<n;i++){
			if(!q[i].size()){
				ans temp;temp.op=1;temp.x=i;temp.y=i;op[++cnt]=temp;
				q[i].push_front(a[id]);
				return ;
			}
		}
	}
	else {
		for(int i=1;i<n;i++){
			if(q[i].size()==1){
				ans temp;temp.op=1;temp.x=i;temp.y=i;op[++cnt]=temp;
				q[i].push_back(a[id]);
				return;
			}
		}
		for(int i=1;i<n;i++){
			if(!q[i].size()){
				ans temp;temp.op=1;temp.x=i;temp.y=i;op[++cnt]=temp;
				q[i].push_front(a[id]);
				return ;
			}
		}
	}
}
void check(){
	int now=0;
	for(int i=1;i<=n;i++){
		while(!q[i].empty())q[i].pop_back();
	}
	for(int i=1;i<=cnt;i++){
		if(op[i].op==1){
			int temp=0;
			if(!q[op[i].x].empty())temp=q[op[i].x].back();
			q[op[i].x].push_back(a[++now]);
			if(temp==a[now]){
				q[op[i].x].pop_back();q[op[i].x].pop_back();
			}
		}
		if(op[i].op==2){
			if(q[op[i].x].front()==q[op[i].y].front()){
				q[op[i].x].pop_front();
				q[op[i].y].pop_front();
			}
			else {
				printf("WRONG!\n");
				return ;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(q[i].size()){
			printf("FALSE::REMAIN %d\n",i);
			return ;
		}
	}
	printf("TRUE\n");
}
vector<int>la[maxn<<1];
void solve(){
	cnt=0;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		while(!q[i].empty())q[i].pop_back();
	}
	for(int i=1;i<=n*2;i++){
		la[i].clear();
		vis[i]=0;
	}
	for(int i=1;i<=m;i++){
		tag[i]=0;
		scanf("%d",&a[i]);
	}
	int dif=0;
	for(int i=1;i<=m;i++){
		if(dif==2*n-1){
			tag[la[a[i]][la[a[i]].size()-1]]=1;
		}
		la[a[i]].push_back(i);	
		if(vis[a[i]]){
			vis[a[i]]=0;
			dif--;
		}
		else {
			vis[a[i]]=1;
			dif++;
		}
	}
	for(int i=1;i<=m;i++){
		if(searchtop(i))continue;
		if(searchdown(i))continue;
		if(searchsize(i)){
			searchdown2(i+1);
			i+=1;
		}
		else pushin(i);
	}
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++){
		if(op[i].op==1){
			printf("1 %d\n",op[i].x);
		}
		else {
			printf("2 %d %d\n",op[i].x,op[i].y);
		}
	}
//	check();
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	scanf("%d",&T);
	while(T--)solve();
}