#include<bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=610,maxm=2e6+1e3;
inline int read()
{
	int x=0,f=1;char c;
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-f;
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
int T;
namespace solve1
{
	int n,m,k,a[maxm];
	deque<int> st[maxn];
	int cnt[maxn];
	inline void add(int x,int c)
	{
		printf("1 %d\n",x);
		st[x].push_back(c);
	}
	inline void main()
	{
		while(T--)
		{
			n=read(),m=read(),k=read();
			For(i,1,n) st[i].clear();
			For(i,1,m) a[i]=read();
			For(i,1,m)
			{
	//			printf("now: %d\n",i);
				int x=a[i],c=(a[i]+1)/2;
				int sz=st[c].size();
				if(!st[c].empty()&&st[c].back()==x)
				{
					add(c,x);
					st[c].pop_back(),
					st[c].pop_back();
				}
				else if(st[c].empty()) add(c,x);
				else if(sz%2) add(c,x);
				else add(n,x);
			}
			while(!st[n].empty())
			{
				int x=st[n].front();
				int c=(x+1)/2;
				assert(st[c].front()==x);
				printf("2 %d %d\n",c,n);
				st[n].pop_front(),
				st[c].pop_front();
			}
		}
	}
}
namespace solve2
{
	int n,m,k,a[maxm];
	deque<int> st[maxn];
	inline void add(int c,int x)
	{
		printf("1 %d\n",c);
		if(!st[c].empty()&&st[c].back()==x) st[c].pop_back();
		else st[c].push_back(x);
	}
	inline void remove(int x,int y)
	{
		if(st[x].front()==st[y].front())
			printf("2 %d %d\n",x,y),
			st[x].pop_front(),
			st[y].pop_front();
	}
	inline void main()
	{
		while(T--)
		{
			n=read(),m=read(),k=read();
			For(i,1,n) st[i].clear();
			For(i,1,m) a[i]=read();
			For(i,1,m)
			{
				if(st[1].empty()) add(1,a[i]);
				else if(st[1].back()==a[i]) add(1,a[i]);
				else add(2,a[i]);
				remove(1,2);
			}
		}
	}
}
/*
namespace solve
{
	mt19937 rnd(time(nullptr));
	deque<int> st[maxn];
	inline void add(int c,int x)
	{
		printf("1 %d\n",c);
		if(st[c].back()==x) st[c].pop_back();
		else st[c].push_back(x);
	}
	inline void remove(int x,int y)
	{
		if(st[x].front()==st[y].front())
			printf("2 %d %d\n",x,y),
			st[x].pop_front(),
			st[y].pop_front();
	}
	inline void main()
	{
		while(T--)
		{
			int n=read(),m=read();
			while(true)
			{
				
			}
		}
	}
}
*/
namespace solve3
{
	int n,m,k,a[maxm];
	deque<int> st[maxn];
	inline void add(int c,int x)
	{
		printf("1 %d\n",c);
		if(!st[c].empty()&&st[c].back()==x) st[c].pop_back();
		else st[c].push_back(x);
	}
	inline void remove(int x,int y)
	{
		if(st[x].front()==st[y].front())
			printf("2 %d %d\n",x,y),
			st[x].pop_front(),
			st[y].pop_front();
	}
	inline void main()
	{
		while(T--)
		{
			n=read(),m=read(),k=read();
			For(i,1,n) st[i].clear();
			For(i,1,m) a[i]=read();
			For(i,1,m)
			{
				if(st[1].empty()) add(1,a[i]);
				else if(st[1].back()==a[i]) add(1,a[i]);
				else if(st[2].empty()) add(2,a[i]);
				else if(st[2].back()==a[i]) add(2,a[i]);
				else add(3,a[i]);
				remove(1,3),remove(2,3);
			}
		}
	}
}
signed main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	T=read();
	if(T%1000==1) solve1::main();
	else if(T%1000==2) solve2::main();
	else solve3::main();
	return 0;
}
/*
3
3 10 5
1 2 3 4 5 2 3 4 5 1
*/
/*
1
4 12 6
1 2 3 4 5 6 2 1 3 4 5 6
*/