#include <bits/stdc++.h>
using namespace std;
const int N = 2000010;
int a[N];
int in[N],out[N],pre[N],id[N];
deque<int> s[810];
set<int> sz[4]; //id
set<int> good;
vector<pair<int,int>> ans;
int n,m,k;
//void debug() {
//	for(int i=1; i<=k; i++) {
//		for(auto x:s[i]) printf("%d ",x);
//		printf("\n");
//	}
//}
void check_del(int x) {
	if(good.find(x)==good.end()) return ;
	good.erase(x);
}
void check_ins(int x) {
	if(s[x].size()!=2) return ;
	if(out[s[x].front()]<out[s[x].back()]) good.insert(x);
}
void p1(int x,int num) {
//	printf("Try push %d to %d\n",a[num],x);
	ans.emplace_back(x,0);
	check_del(x);
	sz[s[x].size()].erase(x);
	if(s[x].size()>0&&a[num]==s[x].back()) {
		s[x].pop_back();
		id[a[num]]=0;//!!
//		printf("delete success\n");
	} else {
		s[x].push_back(a[num]);
//		if(!closeDebug) {
//			printf("insert %d\n",a[num]);
//			debug();
//			assert(id[a[num]]==0);
//		}
		id[a[num]]=x;
	}
	check_ins(x);
	sz[s[x].size()].insert(x);
}
void p2(int x,int y) {
//	printf("Both pop %d %d\n",x,y);
	ans.emplace_back(x,y);
	check_del(x),check_del(y);
	sz[s[x].size()].erase(x);
	sz[s[y].size()].erase(y);
	id[s[x].front()]=0;//!!
	s[x].pop_front();
	id[s[y].front()]=0;//!!
	s[y].pop_front();
	check_ins(x),check_ins(y);
	sz[s[x].size()].insert(x);
	sz[s[y].size()].insert(y);
}
void print() {
	int n=ans.size(),i;
	cout<<n<<endl;
	for(i=0; i<n; i++) {
		if(ans[i].second) cout<<"2 "<<ans[i].first<<" "<<ans[i].second<<endl;
		else cout<<"1 "<<ans[i].first<<endl;
	}
}
void get() {
	ans.clear();
	int i,j; //k=2n-1
	//multi testcases! careful!
	cin>>n>>m>>k;
	k=2*n-1;
	int tot=0;
	sz[0].clear(),sz[1].clear(),sz[2].clear(),sz[3].clear(),good.clear();
	for(i=1; i<=k; i++) s[i].clear(),sz[0].insert(i);
	for(i=1; i<=m; i++) in[i]=out[i]=pre[i]=id[i]=0;
	for(i=1; i<=m; i++) {
		cin>>a[i];
		if(pre[a[i]]) {
			j=a[i];
			++tot;
			in[tot]=pre[j],out[tot]=i;
			a[i]=a[pre[a[i]]]=tot,pre[j]=0;
		} else {
			pre[a[i]]=i;
		}
	}
	for(i=1; i<=m; i++) {
		if(sz[1].size()+2*sz[2].size()+3*sz[3].size()==k-1&&in[a[i]]==i) {
			bool ok=0;
//			for(j=1; j<=n; j++) {
//				if(s[j].size()==2&&out[s[j].front()]<out[s[j].back()]) {
//					p1(j,i);
//					ok=1;
//					break;
//				}
//			}
			if(good.size()) {
				ok=1;
				j=*good.begin();
				p1(j,i);
			}
			if(!ok) {
				assert(s[0].size());
				int x=*s[0].begin();
				p1(x,i);
			}
		} else {
			int x=id[a[i]],y;
			if(x) {
				if(s[x].back()==a[i]) p1(x,i);
				else if(s[x].front()==a[i]) {
					assert(sz[0].size());
					y=*sz[0].begin();
					p1(y,i);
					p2(y,x);
				} 
			} else {
				if(sz[1].size()) {
					x=*sz[1].begin();
					p1(x,i);
				} else if(sz[0].size()) {
					x=*sz[0].begin();
					p1(x,i);
				} 
			}
		}
	}
	//for(i=1; i<=n; i++) if(s[i].size()) assert(0);
	print();
}
signed main() {
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	//remember to close sync! here!
	ios::sync_with_stdio(0),cin.tie(0);
	int T;
	cin>>T;
	while(T--) get();
	return 0;
}
