#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=307;
ll T,n,m,k,a[M],now;
struct node{ll opr,s,s1,s2;};
vector<node> ans;
void print(){
	printf("%lld\n",(ll)ans.size());
	for(auto i:ans){
		if(i.opr==1) printf("1 %lld\n",i.s);
		else printf("2 %lld %lld\n",i.s1,i.s2);
	}
}
namespace Subtask1{
	stack<ll> emp; ll ma[M<<1|1],A[M][2],ap[M];
	ll get(ll x,ll y){return x*n+y;}
	void main(){
		while(T--){
			memset(ma,0,sizeof(ma));
			memset(ap,0,sizeof(ap));
			while(emp.size()) emp.pop();
			ans.clear();
			scanf("%lld%lld%lld",&n,&m,&k);
			for(int i=1;i<n;i++) emp.push(i);
			for(int i=1;i<=m;i++){
				scanf("%lld",&a[i]);
				if(ma[a[i]]){
					if(ma[a[i]]>n){
						ans.push_back((node){1,ma[a[i]]-n,0,0});
						ap[ma[a[i]]-n]--,ma[a[i]]=0;
						if(ap[ma[a[i]]-n]==1)
							emp.push(ma[a[i]]-n);
					}else{
						ans.push_back((node){1,n,0,0}),
						ans.push_back((node){2,n,ma[a[i]],n});
						if(ap[ma[a[i]]]==2){
							A[ma[a[i]]][0]=A[ma[a[i]]][1];
							ma[A[ma[a[i]]][0]]=get(0,ma[a[i]]);
							ap[ma[a[i]]]--,emp.push(ma[a[i]]);
						}else ap[ma[a[i]]]--;
					}
					ma[a[i]]=0;
				}else{
					ans.push_back((node){1,emp.top(),0,0});
					A[emp.top()][ap[emp.top()]++]=a[i];
					ma[a[i]]=get(ap[emp.top()]-1,emp.top());
					if(ap[emp.top()]==2) emp.pop();
				}
			}
			print();
		}
	}
}
namespace Subtask3{
	vector<ll> Ans;
	deque<ll> stac[M];
	ll qq[307];
	bool check(){
		for(int i=1;i<=n;i++) stac[i].clear();
		ll p=0;
		if(ans.size()<m || ans.size()>2*m)
			return 0;
		ll opr,s,s1,s2;
		for(auto i:ans){
			opr=i.opr;
			if(opr==1){
				now=a[++p];
				s=i.s;
				if(stac[s].size() && stac[s].front()==now)
					stac[s].pop_front(); else stac[s].push_front(now);
			}else{
				s1=i.s1,s2=i.s2;
				if(!stac[s1].size()) continue;
				if(!stac[s2].size()) continue;
				if(stac[s1].back()==stac[s2].back())
					stac[s1].pop_back(),stac[s2].pop_back();
			}
		}
		for(int i=1;i<=n;i++)
			if(stac[i].size()) return 0;
		return 1;
	}
	void cre(){
		for(int i=1;i<=n;i++) stac[i].clear();
		ll p=0; ans.clear();
		for(auto i:Ans){
			stac[i].push_front(a[++p]);
			ans.push_back((node){1,i,0,0});
			bool ok=1;
			while(ok){
				ok=0;
				for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){
					if(!stac[i].size()) continue;
					if(!stac[j].size()) continue;
					if(stac[i].back()==stac[j].back()){
						stac[i].pop_back(),stac[j].pop_back();
						ans.push_back((node){2,0,i,j});
						ok=1; goto fin;
					}
				}
				fin:;
			}
		}
	}
	void dfs(int x){
		if(x>m){
			cre();
			if(check()) print(),exit(0);
			return;
		}
		random_shuffle(qq+1,qq+1+n);
		for(int i=1;i<=n;i++)
			Ans.push_back(qq[i]),dfs(x+1),
			Ans.pop_back();
	}
	void main(){
		while(T--){
			scanf("%lld%lld%lld",&n,&m,&k);
			for(int i=1;i<=n;i++) qq[i]=i;
			for(int i=1;i<=m;i++)
				scanf("%lld",&a[i]);
			dfs(1);
		}
	}
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	srand(time(0));
	scanf("%lld",&T);
	if(T%10==1){
		Subtask1::main();
		return 0;
	}
	Subtask3::main();
	return 0;
}