#include<set>
#include<deque>
#include<cstdio>
#include<assert.h>
#include<algorithm>
#define db double
#define pc putchar
#define gc getchar
#define ll long long
#define Tp template<typename _T>
#define Me(a,b) memset(a,b,sizeof(a))
Tp _T mabs(_T x){ return x>0?x:-x; }
Tp _T mmin(_T x,_T y){ return x<y?x:y; }
Tp _T mmax(_T x,_T y){ return x<y?y:x; }
Tp void mswap(_T &x,_T &y){ _T t=x; x=y; y=t; return; }
Tp void print(_T x){ if(x<0) pc('-'),x=-x; if(x>9) print(x/10); pc(x%10+48); return; }
#define maxn
#define maxm
#define MOD
using namespace std;
#define Type int
Type read(){
	Type sum=0; char c=gc(); int flag=0;
	while(c!='-'&&(c<'0'||c>'9')) c=gc();
	if(c=='-') flag=1,c=gc();
	while('0'<=c&&c<='9') sum=(sum<<1)+(sum<<3)+(c^48),c=gc();
	if(flag) return -sum; else return sum;
}
int n,m,k,a[2000039],id[2000039],t[639];
deque<int> st[339];
struct ST{
	int maxr,num,pos;
	bool operator < (const ST x) const {
		if(this->maxr == x.maxr) return this->num > x.num;
		return this->maxr < x.maxr;
	}
};
set<ST> s; set<int> est;
void ins(int x,int pos){
	if(st[pos].empty()) st[pos].push_back(x),est.erase(pos);
	else if(st[pos].back()==x){ st[pos].pop_back(); if(st[pos].empty()) est.insert(pos); }
	else st[pos].push_back(x);
	return;
}
struct JTZ{
	int l,r,pos,flag;
	bool operator < (const JTZ x) const {
		return this->l < x.l;
	}
}p[1000039]; int p_cnt,now,cur;
struct Opt{ int opt,x,y; }ans[4000039]; int ans_cnt;
#define INF 0x7fffffff
void work(){
	n=read(); m=read(); k=read(); s.clear(); int i; for(i=1;i<=m;i++) a[i]=read();
	p_cnt=0; ans_cnt=0; s.clear(); for(i=1;i<=k;i++) t[i]=0; for(i=1;i<=n;i++) st[i].clear();
	est.clear(); for(i=1;i<=n;i++) est.insert(i);
	for(i=1;i<=m;i++){
		if(!t[a[i]]) t[a[i]]=i;
		else p_cnt++,p[p_cnt].l=t[a[i]],p[p_cnt].r=i,t[a[i]]=0;
	}
	sort(p+1,p+p_cnt+1);
	for(i=1;i<=n;i++) s.insert((ST){0,i,0});
	for(i=1;i<=p_cnt;i++) id[p[i].l]=id[p[i].r]=i;
	for(i=1;i<=p_cnt;i++){
		auto it=s.upper_bound((ST){p[i].r,0,0});
		if(it!=s.end()){ p[i].pos=(*it).num,p[i].flag=0; continue; }
		it=s.upper_bound((ST){p[i].l,0,0});
		if(it!=s.end()){
			p[i].pos=(*it).num,p[(*it).pos].flag=1;
			s.erase(it); s.insert((ST){p[i].r,p[i].pos,i}); continue;
		}
		it=s.end(); it--; p[i].flag=0; p[i].pos=(*it).num; assert((*it).maxr<p[i].l);
		s.erase(it); s.insert((ST){p[i].r,p[i].pos,i});
	}
	for(i=1;i<=m;i++){
		now=id[i];
		if(p[now].flag&&p[now].r==i){
			assert(!est.empty());
			cur=*(est.begin()); assert(st[p[now].pos].front()==a[i]);
			st[p[now].pos].pop_front(); if(st[p[now].pos].empty()) est.insert(p[now].pos);
			ans_cnt++; ans[ans_cnt].opt=1; ans[ans_cnt].x=cur;
			ans_cnt++; ans[ans_cnt].opt=2; ans[ans_cnt].x=p[now].pos; ans[ans_cnt].y=cur;
		} else {
			ans_cnt++; ans[ans_cnt].opt=1; ans[ans_cnt].x=p[now].pos;
			ins(a[i],p[now].pos);
		}
	}
	print(ans_cnt),pc('\n');
	for(i=1;i<=ans_cnt;i++){
		print(ans[i].opt),pc(' '),print(ans[i].x);
		if(ans[i].opt==2) pc(' '),print(ans[i].y);
		pc('\n');
	} return;
}
int main(){
	//freopen("meow2.in","r",stdin);
	//freopen("meow.out","w",stdout);
	int T=read(); while(T--) work(); return 0;
}
//NOIP or CodeForces???