#include<bits/stdc++.h>
// #define int long long
// #define mod 1000000007
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
using namespace std;
void setIn(string s){freopen(s.c_str(),"r",stdin);}
void setOu(string s){freopen(s.c_str(),"w",stdout);}
void setIO(string s){setIn(s+".in");setOu(s+".out");}
typedef pair<int,int> pii;
template<class T>void chkmax(T &a,T b){a=max(a,b);}
template<class T>void chkmin(T &a,T b){a=min(a,b);}
// template<class T>T read(T &x)
// {
// 	x=0;T f=1;char c=getchar();
// 	while(!isdigit(c)){if(c=='-'){f=-1;}c=getchar();}
// 	while(isdigit(c)){x=x*10+(c-'0');c=getchar();}
// 	return x=x*f;
// }
// template<class T>void write(T x)
// {
// 	if(x<0){putchar('-');x=-x;}
// 	if(x>9)write(x/10);
// 	putchar(x%10+'0');
// }
// template<class T>void write(T x,char c){write(x),putchar(c);}
int n,m,k,a[2000005],b[2000005],lst[605],pos[605];
deque <int> q[305];
map <int,int,greater<int>> s1;
map <int,int> s2;
set <int> s3;
struct node{int op,l,r;};
vector <node> ans;
//q[i]记录序列 q[0]记录空序列
//s1 记录一个递增序列 最后一个位置 下一次出现位置
//s2 记录一个递减序列 最后一个位置 下一次出现位置
//s3 单个的
void add(int p)
{
	if(q[p].size()==0)
		q[0].push_back(p);
	else if(q[p].size()==1)
		s3.insert(p);
	else
	{
		if(b[q[p].front()]<b[q[p].back()])
			s1[b[q[p].back()]]=p;
		else
			s2[b[q[p].back()]]=p;
	}
}
void del(int p)
{
	assert(q[p].size());
	if(q[p].size()==1)s3.erase(p);
	else
	{
		s1.erase(b[q[p].back()]);
		s2.erase(b[q[p].back()]);
	}
}
void work()
{
	cin>>n>>m>>k;
	rep(i,1,k)lst[i]=m+1;
	rep(i,1,k)pos[i]=0;
	rep(i,0,n)q[i].clear();
	rep(i,1,m)cin>>a[i];
	per(i,m,1)b[i]=lst[a[i]],lst[a[i]]=i;
	s1.clear(),s2.clear(),s3.clear();
	ans.clear();

	rep(i,1,n)q[0].push_back(i);
	rep(i,1,m)
		if(pos[a[i]])
		{
			int p=pos[a[i]];
			if(a[q[p].back()]==a[i])
			{
				ans.push_back({1,p,0});
				// cout<<1<<' '<<p<<'\n';
				del(p);
				q[p].pop_back();
				pos[a[i]]=0;
				if(q[p].size())pos[a[q[p].back()]]=p;
				add(p);
			}
			else if(a[q[p].front()]==a[i])
			{
				ans.push_back({1,q[0].back(),0});
				ans.push_back({2,p,q[0].back()});
				// cout<<1<<' '<<q[0].back()<<'\n';
				// cout<<2<<' '<<p<<' '<<q[0].back()<<'\n';
				del(p);
				q[p].pop_front();
				pos[a[i]]=0;
				if(q[p].size())pos[a[q[p].front()]]=p;
				add(p);
			}
			else assert(0);
		}
		else
		{
			if(s3.size())
			{
				int p=*s3.begin();
				ans.push_back({1,p,0});
				// cout<<1<<' '<<p<<'\n';
				del(p);
				q[p].push_back(i);
				pos[a[i]]=p;
				add(p);
			}
			else
			{
				auto it=s1.lower_bound(b[i]);
				if(it!=s1.end())
				{
					int p=(*it).second;
					ans.push_back({1,p,0});
					// cout<<1<<' '<<p<<'\n';
					del(p);
					pos[a[q[p].back()]]=0;
					q[p].push_back(i);
					pos[a[i]]=p;
					add(p);
					continue;
				}
				it=s2.lower_bound(b[i]);
				if(it!=s2.end())
				{
					int p=(*it).second;
					ans.push_back({1,p,0});
					// cout<<1<<' '<<p<<'\n';
					del(p);
					pos[a[q[p].back()]]=0;
					q[p].push_back(i);
					pos[a[i]]=p;
					add(p);
					continue;
				}
				int p=q[0].front();
				ans.push_back({1,p,0});
				// cout<<1<<' '<<p<<'\n';
				q[0].pop_front();
				q[p].push_back(i);
				pos[a[i]]=p;
				add(p);
			}
		}
	cout<<ans.size()<<endl;
	for(auto [op,l,r]:ans)
		if(op==1)cout<<1<<' '<<l<<'\n';
		else cout<<2<<' '<<l<<' '<<r<<'\n';
}
signed main()
{
	setIO("meow");
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;cin>>T;
	while(T--)work();
}