#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define i64 long long
#define pii pair <int,int>
inline int read(void) {
    int sgn=1,x=0; char c=getchar();
    while(c<'0'||c>'9') { (c=='-'&&(sgn=0)); c=getchar(); }
    while('0'<=c&&c<='9') x=x*10+c-'0',c=getchar();
    return sgn ? x : -x;
}
void write(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10),x%=10;
    putchar(x+'0');
}
int n,m,k;
int a[2000006];
int b[500],t[500],v[1000],ref[1000];
int lst[1000],nxt[1000];
pii stk[4000006]; int cnt;
struct qwq {
    int val[8];
    int ql=0,qr=0;
    inline void pb(int x) {
        val[(++qr)&7]=x;
    }
    inline void pf(int x) {
        val[ql&7]=x;
        ql=ql+7;
    }
    inline int frt(void) {
        return val[(ql+1)&7];
    }
    inline int back(void) {
        return val[qr&7];
    }
    inline void popb(void) {
        --qr;
    }
    inline void popf(void) {
        ql++;
    }
    inline int siz(void) {
        return ((qr-ql)%8+8)%8;
    }
} S[500];
int epty=n;
mt19937 rnd(time(0));
int p[500];
inline void shuffle(void) {
    for(int i=1; i<n; ++i) p[i]=i,swap(p[i],p[rnd()%i+1]);
}
inline void output(void) {
    write(cnt); puts("");
    for(int i=1; i<=cnt; ++i) {
        if(stk[i].first==0) printf("1 %d\n",stk[i].second);
        else printf("2 %d %d\n",stk[i].first,stk[i].second);
    }
    cnt=0;
}
int Q;
int SSSiz[500];
int nxtv[1000];
inline void work(void) {
    n=read(); m=read(); k=read(); cnt=0;
    for(int i=1; i<=m; ++i) a[i]=read();
    if(k==2*n-2) {
        for(int i=1; i<=m; ++i) {
            int u=(a[i]+1)/2;
            if(!b[u]) {
                b[u]=a[i];
                stk[++cnt]=make_pair(0,u);
            } else if(!t[u]) {
                stk[++cnt]=make_pair(0,u);
                if(a[i]==b[u]) {
                    b[u]=0;
                } else t[u]=a[i];
            } else {
                if(a[i]==b[u]) {
                    stk[++cnt]=make_pair(0,n);
                    stk[++cnt]=make_pair(u,n);
                    b[u]=t[u];
                    t[u]=0;
                } else {
                    stk[++cnt]=make_pair(0,u);
                }
            }
        }
        output();
        return ;
    }
    // cout<<"start"<<endl;
    for(int i=1; i<=m; ++i) {
        nxt[lst[a[i]]]=i;
        lst[a[i]]=i;
    }
    for(int i=1; i<=k; ++i) nxt[lst[i]]=n+1;
    int cntv=0;
    for(int i=1; i<=m; ++i) {
        if(a[i]==Q) Q=0;
        nxtv[a[i]]=nxt[i];
        if(v[a[i]]) {
            int u=v[a[i]];
            if(S[u].back()==a[i]) {
                stk[++cnt]=make_pair(0,u);
                S[u].popb();
                --SSSiz[u];
            } else if(S[u].frt()==a[i]) {
                stk[++cnt]=make_pair(0,n);
                stk[++cnt]=make_pair(u,n);
                S[u].popf();
                --SSSiz[u];
            } else{
                // puts("fail to d");
            }
            v[a[i]]=0;
            --cntv;
            // cout<<i<<"to 0 end"<<endl;
            continue;
        }
        if(cntv==k-1&&Q==0) {
            Q=a[i];
            for(int u=1; u<n; ++u) if(nxtv[S[u].frt()]<nxtv[S[u].back()]) {
                // cout<<u<<' '<<S[u].frt()<<' '<<S[u].back()<<' '<<nxtv[S[u].frt()]<<' '<<nxtv[S[u].back()]<<endl;
                v[a[i]]=u;
                stk[++cnt]=make_pair(0,u);
                S[u].pb(a[i]);
                ++SSSiz[u];
                break;
            }
            // cout<<v[a[i]]<<endl;
            if(!v[a[i]]) 
                // puts("fail to A");
            // cout<<i<<"add end"<<"to"<<v[a[i]]<<endl;
            
                ++cntv;
            continue;
        }
        shuffle();
        for(int l=1; l<n; ++l) {
            #define u p[l]
            if(SSSiz[u]<2) {
                stk[++cnt]=make_pair(0,u);
                S[u].pb(a[i]);
                v[a[i]]=u;
                ++cntv;
                ++SSSiz[u];
                break;
            }
            #undef u
        }
        
            // cout<<i<<"random add end to"<<v[a[i]]<<endl;
    }
    output();
    for(int i=1; i<=n; ++i) if(SSSiz[i]=0) {
        // cout<<"warn"<< ' '<<i<<" th stack non empty\n";
    }
    for(int i=1; i<=n; ++i) S[i].ql=S[i].qr=0;
    memset(nxtv,0,sizeof nxtv);
    memset(nxt,0,sizeof nxt);
    memset(S,0,sizeof S);
    memset(SSSiz,0,sizeof SSSiz);
}
signed main() {
    freopen("meow.in","r",stdin);
    freopen("meow.out","w",stdout);
    int T=read();
    while(T--) work();
    return 0;
}