#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,a[2000039];
int Ms[639];map<int,int>M;
struct Ans{int opt,s1,s2;};
queue<Ans>ans;
namespace Part1{
	void ans_clear(){
		while(!ans.empty())ans.pop();
	}
	void main(){
		while(T--){
	    	scanf("%d%d%d",&n,&m,&k);
	    	for(int i=1;i<=m;i++){scanf("%d",&a[i]);}
			ans_clear();M.clear();
			for(int i=1;i<=m;i++){
				if(M[a[i]]){
					if(M[a[i]]&1){
						ans.push((Ans){1,n,0});
						ans.push((Ans){2,(M[a[i]]+1)/2,n});
						Ms[M[a[i]]]=Ms[M[a[i]]+1];
						M[Ms[M[a[i]]+1]]--;
						Ms[M[a[i]]+1]=0;
						M[a[i]]=0;
					}else{
						ans.push((Ans){1,(M[a[i]]+1)/2+1,0});
						Ms[M[a[i]]]=0;
						M[a[i]]=0;
					}
				}
				else{
					int ret=0;
					for(int j=1;j<2*n-1;j++)if(!Ms[j])ret++;
					ret=rand()%ret+1;
					for(int j=1;j<2*n-1;j++){
						if(!Ms[j])ret--;
						if(!ret){
							if(((j&1)^1)&&!Ms[j-1])j--;
							ans.push((Ans){1,(j+1)/2,0});
							M[a[i]]=j;
							Ms[j]=a[i];
							break;
						}
					}	
				}
			}
			printf("%d\n",ans.size());
			while(!ans.empty()){
				if(ans.front().opt&1){
					printf("1 %d\n",ans.front().s1);
				}else{
					printf("2 %d %d\n",ans.front().s1,ans.front().s2);
				}
				ans.pop();
			}
		}
	}
}
namespace Part2{
	vector<int>q;
	void ans_clear(){
		while(!ans.empty())ans.pop();
	}
	bool check(){
		if(!q.size())return 1;
		else{
			while(q.size()>=2){
				if(*q.end()==q[q.size()-2]){
					q.erase(q.end()-1,q.end());
				}
				else break;
			}
			if(!q.size())return 1;
			else return 0;
		}
	}
	bool dfs(int i){
		if(i==n+1)return check();
		if(a[i]==*q.begin()&&a[i]==*q.end()){
			q.erase(q.end());
			if(dfs(i+1))ans.push((Ans){1,1,0});
			else{
				ans.push((Ans){1,2,0});
				ans.push((Ans){2,1,2});
				q.push_back(a[i]);
				q.erase(q.begin());
				return dfs(i+1);
			}
		}
		else if(a[i]==*q.begin()){
			q.erase(q.begin());
			ans.push((Ans){1,2,0});
			ans.push((Ans){2,1,2});
			return dfs(i+1);
		}
		else if(a[i]==*q.end()){
			q.erase(q.end());
			ans.push((Ans){1,1,0});
			return dfs(i+1);
		}
		else{
			q.push_back(a[i]);
			ans.push((Ans){1,1,0});
			return dfs(i+1);
		}
		return 0;
	}
	void main(){
		while(T--){
			ans_clear();q.clear();
	    	scanf("%d%d%d",&n,&m,&k);
	    	for(int i=1;i<=m;i++){scanf("%d",&a[i]);}
			q.push_back(a[1]);
			ans.push((Ans){1,1,0});
			dfs(2);
			printf("%d\n",ans.size());
			while(!ans.empty()){
				if(ans.front().opt&1){
					printf("1 %d\n",ans.front().s1);
				}else{
					printf("2 %d %d\n",ans.front().s1,ans.front().s2);
				}
				ans.pop();
			}
		}
	}
}
int main(){
    freopen("meow.in","r",stdin);
    freopen("meow.out","w",stdout);
    scanf("%d",&T);
    if(T%1000==1)Part1::main();
    if(T%1000==2)Part2::main();
    
    return 0;
}
