#include<bits/stdc++.h>
using namespace std;
constexpr int N=300,tN=N<<1,M=2000000;
int a[M+10];
vector<int> vec[tN+10];
struct _{
	int x,nxt;
	bool operator<(const _ &ob)const{return nxt>ob.nxt;}
};
deque<int> q0,q1;
priority_queue<_> pq;
struct __{
	int x,d;
}pos[tN+10];
int s[N+10][3],sid,tid,cnt[N+10];
struct upd{
	int op,u,v;
};
vector<upd> opers;
void update1(int x){opers.push_back({1,x,0});}
void update2(int u,int v){opers.push_back({2,u,v});}
void popf(int x){
	--cnt[x];
	if(!cnt[x]) pq.pop();
	s[x][cnt[x]]=0;
	if(!cnt[x]) q0.push_back(x);
	if(cnt[x]==1) q1.push_back(x);
}
void popb(int x){
	--cnt[x];
	pq.pop();
	int i;
	for(i=0;i<cnt[x];++i) s[x][i]=s[x][i+1],pos[s[x][i]]={x,i};
	s[x][cnt[x]]=0;
	if(cnt[x]) pq.push({x,vec[s[x][0]].back()});
	if(!cnt[x]) q0.push_back(x);
	if(cnt[x]==1) q1.push_back(x);
}
void pushf(int x,int c){
	update1(x);
	s[x][cnt[x]]=c;
	pos[c]={x,cnt[x]};
	if(!cnt[x]) pq.push({x,vec[c].back()}),q1.push_back(x);
	++cnt[x];
}
int main(){
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--){
		opers.clear();
		int n,m,K;
		cin>>n>>m>>K;
		int i;
		for(i=1;i<=m;++i) cin>>a[i];
		if(n==1){
			cout<<m<<'\n';
			for(i=1;i<=m;++i) cout<<"1 1\n";
			continue;
		}
		for(i=m;i>=1;--i) vec[a[i]].push_back(i);
		for(i=1;i<=n;++i) q0.push_back(i);
		for(i=1;i<=m;++i){
			vec[a[i]].pop_back();
			if(pos[a[i]].x){
				int x=pos[a[i]].x,d=pos[a[i]].d;
				if(d==cnt[x]-1){
					update1(x);
					popf(x);
					if(x==sid) sid=tid=0;
				}
				else{
					update1(q0.back());
					update2(q0.back(),x);
					popb(x);
				}
				pos[a[i]]={0,0};
				continue;
			}
			if(q0.size()>1){
				int tmp=q0.back();
				q0.pop_back();
				pushf(tmp,a[i]);
				continue;
			}
			if(sid&&cnt[tid]==1){
				pushf(sid,a[i]);
				sid=tid,tid=0;
				continue;
			}
			while(!q1.empty()){
				if(cnt[q1.back()]!=1) q1.pop_back();
				else break;
			}
			if(q1.size()>0){
				int tmp=q1.back();
				q1.pop_back();
				pushf(tmp,a[i]);
				continue;
			}
			_ tmp=pq.top();
			int x=tmp.x;
			if(vec[s[x][1]].back()<vec[s[x][0]].back()){
				sid=q0.back();
				q0.pop_back();
				pushf(sid,a[i]);
				tid=x;
				if(vec[a[i]].back()<vec[s[x][0]].back()) tid=0;
			}
			else pushf(x,a[i]);
		}
		q0.clear();
		q1.clear();
		cout<<opers.size()<<'\n';
		for(auto &i:opers){
			if(i.op==1) cout<<i.op<<' '<<i.u<<'\n';
			else cout<<i.op<<' '<<i.u<<' '<<i.v<<'\n';
		}
	}
	return 0;
}
