#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
	return x*f;
}
//map<int,pair<int,int> >M;//judge the zt -1bottom 1top 0 none 
int T,n,m,k,tot,Tot;
struct ANSS{
	int opt,s1,s2;
}ans[4000006];
deque<int>S[2];
//bool x_o=0;
int a[2000006];
//void dfs(int x){
//	if(x_o)return;
//	if(x>m){
//		if(res==0){
//			x_o=1;
//		}
//		return;
//	}
//	if(M.find(a[x])!=M.end()&&M[a[x]].first!=0){
//		int op=M[a[x]].first,st=M[a[x]].second;
//		if(op==1){
//			S[st].pop_front();
//			res-=2;
//			ans[++ans2].opt=1;
//			ans[ans2].s1=st;
//			M[a[x]].first=0;
//			if(!S[st].empty())M[S[st].front()]={1,st};
//			dfs(x+1);
//			if(!S[st].empty())M[S[st].front()]={0,st};
//			M[a[x]].first=1;
//			ans2--;
//			res+=2;
//			S[st].push_front(a[x]);
//		}else{
//			if(tot<n){
//				S[st].pop_back();
//				res-=2;
//				ans[++ans2].opt=2;
//				ans[ans2].s1=st;
//				ans[ans2].s2=++tot;
//				M[a[x]].first=0;
//				M[S[st].back()]={-1,st};
//				dfs(x+1);
//				M[S[st].back()]={0,st};
//				M[a[x]].first=-1;
//				S[st].push_back(a[x]);
//				res+=2;
//				ans2--;
//				tot--;
//			}
//		}
//	}
//	
//}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	T=read();
	while(T--){
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++){
			a[i]=read();
		}
		tot=0,Tot=0;
		while(tot++<m){
			if(S[0].empty()&&S[1].empty()){
				S[0].push_front(a[tot]);
				ans[++Tot].opt=1;
				ans[Tot].s1=1;
			}
			else if(!S[0].empty()&&S[1].empty()){
				if(S[0].front()==a[tot]){
					S[0].pop_front();
					ans[++Tot].opt=1;
					ans[Tot].s1=1;
				}
				else{
					S[1].push_front(a[tot]);
					ans[++Tot].opt=1;
					ans[Tot].s1=2;
				}
			}else if(!S[1].empty()&&S[0].empty()){
				if(S[1].front()==a[tot]){
					S[1].pop_front();
					ans[++Tot].opt=1;
					ans[Tot].s1=2;
				}
				else{
					S[0].push_front(a[tot]);
					ans[++Tot].opt=1;
					ans[Tot].s1=1;
				}
			}else{
				if(S[1].front()==a[tot]){
					S[1].pop_front();
					ans[++Tot].opt=1;
					ans[Tot].s1=2;
				}
				else{
					S[0].pop_front();
					ans[++Tot].opt=1;
					ans[Tot].s1=1;
				}
			}
			while(!S[0].empty()&&!S[1].empty()&&S[0].back()==S[1].back()){
				S[0].pop_back(),S[1].pop_back();
				ans[++Tot].opt=2;
				ans[Tot].s1=1;
				ans[Tot].s2=2;
			}
		}
		printf("%d\n",Tot);
		for(int i=1;i<=Tot;i++){
			printf("%d ",ans[i].opt);
			if(ans[i].opt==1)printf("%d\n",ans[i].s1);
			else printf("%d %d\n",ans[i].s1,ans[i].s2);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
