#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+7;
int read()
{
	int res=0,f=1;
	char c=getchar();
	while(c!='-' && !isdigit(c)) c=getchar();
	if(c=='-') f=-1,c=getchar();
	while(isdigit(c)) res=res*10+c-48,c=getchar();
	return res*f;
}
bool st;
int a[maxn];
int tg[maxn],nt[maxn],now[maxn];
struct kk
{
	int op,x,y;
}anss[maxn];
int tot;
void work1(int l,int r,int n)
{
	int ls=0;
	for(int i=l;i<=maxn-7;i++) tg[i]=nt[i]=0;
	for(int i=l;i<=r;i++)
	{
		if(tg[a[i]])
			nt[tg[a[i]]]=i,ls=max(ls,tg[a[i]]),tg[a[i]]=0;
		else 
			tg[a[i]]=i;
	}
	for(int i=l+1,j=l;i<=r;i++)
	{
//		cout<<nt[i]<<' ';
		if(!nt[i]) 
		{
			if(now[a[i]]==1) anss[i]=(kk){1,n,0};
			else 
			{
//				anss[i]=(kk){1,2,0};
				anss[i]=(kk){2,2,1};
			}
			continue;
		}
		if(nt[j]<nt[i])	
		{
			anss[j]=(kk){1,1,0};
			now[a[j]]=2; tot++;
			if(i==ls) anss[i]=(kk){1,1,0};
		}
		else 
		{
			anss[j]=(kk){1,n,0};
			now[a[j]]=1;
			if(i==ls) anss[i]=(kk){1,n,0};
		}
		j=i;
	}
}
int gg[maxn],col[maxn];;
void work2(int l,int r)
{
	for(int i=l;i<=r;i++)
		anss[i]=(kk){1,gg[a[i]],0};
}
stack<int> q[maxn];
bool work3(int l,int r,int n)
{
	for(int i=l;i<=r;i++) q[a[i]].push(i);
	for(int i=l;i<=r;i++)
		if(q[a[i]].top()>=i) nt[i]=q[a[i]].top(),q[a[i]].pop(); else nt[i]=0;
	int nw=1;
	anss[l]=(kk){1,1,0};
	anss[nt[l]]=(kk){1,1,0};
	for(int i=l+1,j=l;i<=r;i++)
	{
		if(!nt[i]) 
		{
			if(now[a[i]]==3) nw--;
			continue;
		}
		if(nt[j]<nt[i])	nw++,now[nt[j]]=3;
		if(nw>n) return 0;
		anss[i]=(kk){1,nw,0};
		anss[nt[i]]=(kk){1,nw,0};
		j=i;
	}
	return 1;
}
bool ed;
int main()
{
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
//	printf("%.10lf\n",(&st-&ed)/1024.0/1024.0);
	int T=read();
	while(T--)
	{
		int n=read(),m=read(),k=read(),K=0;
		for(int i=1;i<=m;i++) 
		{
			a[i]=read();
			if(col[a[i]]!=T+1) gg[a[i]]=++K;
			col[a[i]]=T+1;
		}
		if(n==1)
		{
			for(int i=1;i<=m;i++) puts("1 1");
			continue;
		}
		tot=m;
		if(K<=n)
			work2(1,m);
		else
		if(!work3(1,m,n))
			work1(1,m,n);
		printf("%d\n",tot);
		for(int i=1;i<=m;i++)
		{
			if(anss[i].op==1) printf("1 %d\n",anss[i].x);
			else printf("1 %d\n2 %d %d\n",anss[i].x,anss[i].y,anss[i].x);
		}
	}
	return 0;
}
/*
1
2 10 4
2 1 4 3 2 2 1 4 3 2
*/