#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N(605),M(1e6+5);
int T;
int n,m,K;
int now[N][N],cnt[N];
struct op{
	int x,y,z;
	op(){x=0,y=0,z=0;}
	op(int _x,int _y,int _z=0){
		x=_x,y=_y,z=_z;
	}
};
vector<op> ans;
int pos[N],nex[M],np[N];
inline void op1(int x,int y){
	if(cnt[x])np[now[x][1]]=np[now[x][cnt[x]]]=0;
	if(now[x][cnt[x]]==y&&cnt[x]) --cnt[x];
	else now[x][++cnt[x]]=y;
	if(cnt[x])np[now[x][1]]=np[now[x][cnt[x]]]=x;
	ans.push_back(op(1,x));
}
inline void op2(int x,int y){
	if(now[x][1]!=now[y][1]) return ;
	if(cnt[x])np[now[x][1]]=np[now[x][cnt[x]]]=0;
	if(cnt[y])np[now[y][1]]=np[now[y][cnt[y]]]=0;
	
	for(int i=1;i<cnt[x];++i) now[x][i]=now[x][i+1];
	--cnt[x];
	for(int i=1;i<cnt[y];++i) now[y][i]=now[y][i+1];
	--cnt[y];
	
	if(cnt[x])np[now[x][1]]=np[now[x][cnt[x]]]=x;
	if(cnt[y])np[now[y][1]]=np[now[y][cnt[y]]]=y;
	
	ans.push_back(op(2,x,y));
}
bool OK;int a[M];
int sd,nn[N];
queue<int> emp;
bool in[N];
void solve(){
	cin>>n>>m>>K;
	int x,y;
	for(int i=1;i<=m;++i) cin>>a[i];
	for(int i=m;i>=1;--i){
		nex[i]=pos[a[i]];
		pos[a[i]]=i;
	}
	sd=n;
	for(int i=1;i<n;++i) {
		emp.push(i);in[i]=1;
	}
	int mx;
		
	for(int i=1;i<=m;++i){
		while(!emp.empty()&&emp.front()==sd) continue;
		x=a[i];
//		if(x==K) continue;
		OK=1;nn[x]=nex[i];
		if(np[x]){
			y=np[x];
			if(now[y][cnt[y]]==x){
				op1(y,x);
			}
			else{
				op1(sd,x);
				op2(y,sd);
			}
			if(cnt[y]<2&&!in[y]) in[y]=1,emp.push(y);
		}
		else if(!emp.empty()){
			y=emp.front();emp.pop();in[y]=0;
			op1(y,x);
			if(cnt[y]<2&&!in[y]) in[y]=1,emp.push(y);
		}
		else{
			OK=1;
			for(int j=n;j>=1;--j){
				if(nn[now[j][2]]>nn[now[j][1]]||nn[now[j][2]]>nn[x]){
					OK=0;
					np[now[j][2]]=0;
					op1(j,x);
					break;
				}
			}
			if(OK){
				op1(sd,x);
				for(int j=i+1;j<=n;++j){
					x=a[j];
					y=np[x];
					if(now[y][cnt[y]]==x){
						op1(y,x);
					}
					else{
						op1(sd,x);
						op2(y,sd);
					}
					if(!cnt[y]) {
						sd=y;
						i=j;
						break;
					}
					if(cnt[y]<2&&!in[y]) in[y]=1,emp.push(y);
				}
			}
		}
		
	}
	cout<<ans.size()<<endl;
	for(int i=0;i<(int)ans.size();++i){
		cout<<ans[i].x<<' '<<ans[i].y;
		if(ans[i].x==2) cout<<' '<<ans[i].z;
		cout<<endl;
	}

	while(!emp.empty()) emp.pop();
	for(int i=1;i<=K;++i) {
		cnt[i]=0;
		np[i] =0;
		pos[i]=0;
		nn[i]=0;
		in[i]=0;
	}
	for(int i=1;i<=m;++i){
		nex[i]=0;
	}
	ans.clear();
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	ios::sync_with_stdio(0);
	cin>>T;
	while(T--) solve();
}