#include<bits/stdc++.h>
using namespace std;
char Getchar(){
    static char now[1<<20],*S,*T;
    if (T==S){
        T=(S=now)+fread(now,1,1<<20,stdin);
        if (T==S) return EOF;
    }
    return *S++;
}
int read(){
    int x=0,f=1;
    char ch=Getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=Getchar();
    }
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=Getchar();
    return x*f;
}
struct mydeque{
    vector<int> vec; int val;
    int size(){
        return (int)vec.size()-val;
    }
    int front(){
        assert(val<vec.size());
        return vec[val];
    }
    int back(){
        assert(val<vec.size());
        return vec.back();
    }
    void pop_back(){
        assert(val<vec.size());
        vec.pop_back();
    }
    void pop_front(){
        assert(val<vec.size());
        val++;
    }
    void push_back(int v){
        vec.push_back(v);
    }
    void clr(){
        vec.clear();
        val=0;
    }
} Q[310];
// void push(int x,int y){
//     printf("1 %d\n",x);
//     if (Q[x].size()&&Q[x].back()==y) Q[x].pop_back();
//     else Q[x].push_back(y);
// }
// void pop(int x,int y){
//     printf("2 %d %d\n",x,y);
//     assert(Q[x].front()==Q[y].front());
//     Q[x].pop_front(); Q[y].pop_front();
// }
vector<int> pp[2]; int bel[2100000];
void upd(int x){
    if (Q[x].size()<2) pp[Q[x].size()].push_back(x);
}
int getpos(int op){
    while (!pp[op].empty()&&Q[pp[op].back()].size()!=op) pp[op].pop_back();
    if (!pp[op].empty()) return pp[op].back();
    else return -1;
}
int getpos2(int op){
    int t=pp[op].back(); pp[op].pop_back();
    while (!pp[op].empty()&&(Q[pp[op].back()].size()!=op||pp[op].back()==t)) pp[op].pop_back();
    int res=-1;
    if (!pp[op].empty()) res=pp[op].back();
    pp[op].push_back(t);
    return res;
}
vector<pair<int,int>> Ans;
void push2(int x,int y){
    assert(x);
    Ans.emplace_back(-1,x);
    // printf("1 %d\n",x);
    if (Q[x].size()&&Q[x].back()==y){ Q[x].pop_back();}
    else{ Q[x].push_back(y); bel[y]=x;}
    upd(x);
}
void pop2(int x,int y){
    assert(x);
    Ans.emplace_back(x,y);
    // printf("2 %d %d\n",x,y);
    assert(Q[x].front()==Q[y].front()); int v=Q[x].front();
    Q[x].pop_front(); Q[y].pop_front();
    upd(x); upd(y);
}
int getbel(int x){
    // if (!bel[x]) return 0;
    // if (Q[bel[x]].size()==2&&Q[bel[x]].front()!=x&&Q[bel[x]].back()!=x) return 0;
    return bel[x];
}
int getbel2(int x){
    if (!bel[x]||!Q[bel[x]].size()) return 0;
    if (Q[bel[x]].front()!=x&&Q[bel[x]].back()!=x) return 0;
    return bel[x];
}
bool istop(int x){
    return Q[bel[x]].back()==x;
}
bool notin(int x){
    if (!bel[x]||Q[bel[x]].size()==0) return true;
    if (Q[bel[x]].front()!=x&&Q[bel[x]].back()!=x) return true;
    return false;    
}
//So give me reason, to prove me wrong, wash this memory clean!
int T,n,m,k,a[2100000];
int main(){
    freopen("meow.in","r",stdin);
    freopen("meow.out","w",stdout);
    T=read();
    while (T--){
        n=read(); m=read(); k=read();
        // if (k==n+n-2){
        //     for (int i=1,x,y;i<=m;i++){
        //         x=read(); y=((x+1)>>1);
        //         if (Q[y].size()<=1||Q[y].front()==x) push(y,x);
        //         else push(n,x),pop(y,n);
        //     }
        //     for (int i=1;i<=n;i++){
        //         assert(Q[i].size()==0);
        //         Q[i].clr();
        //     }
        //     continue;
        // }
        pp[0].clear(); pp[1].clear();
        for (int i=1;i<=n;i++) bel[i]=0,pp[0].push_back(i);
        for (int i=1;i<=m;i++) a[i]=read();
        for (int i=1;i<=m;i++){
            assert(getpos(0)!=-1);
            // cerr<<i<<'\n';
            // if (i==34896){
            //     puts("");
            // }
            int x=a[i],y;
            if (!getbel2(x)){
                int op1=getpos(1);
                int op0=getpos(0);
                if (op1==-1&&getpos2(0)==-1){
                    int j=i+1,val=-1;
                    for (;j<=m;j++)
                        if (a[j]==x||!istop(a[j])){
                            val=a[j];
                            break;
                        }
                    int bb=getbel(val);
                    bool vis=false;
                    if (val!=x&&val!=-1){
                        int t=Q[bb].back(),pos2=-1;
                        for (int k=i+1;k<=j;k++)
                            if (a[k]==t){
                                pos2=k;
                                break;
                            }
                        if (pos2==-1){
                            push2(bb,x);
                            for (int k=i+1;k<j;k++) push2(getbel(a[k]),a[k]);
                            push2(op0,val); pop2(bb,op0);
                        } else{
                            push2(op0,x);
                            for (int k=i+1;k<=pos2;k++) push2(getbel(a[k]),a[k]);
                            bel[t]=op0;
                            for (int k=pos2+1;k<j;k++) push2(getbel(a[k]),a[k]);
                            assert(Q[bb].back()==val); push2(bb,val);
                        }
                    } else{
                        push2(op0,x);
                        for (int k=i+1;k<=j;k++) push2(bel[a[k]],a[k]);
                    }
                    i=j;
                } else{
                    int op=(op1==-1?op0:op1);
                    push2(op,x);
                }
            } else{
                // cerr<<"tmp\n";
                if (notin(x)||istop(x)){
                    push2(getbel2(x),x);
                } else{
                    int nn=getpos(0); assert(nn!=-1);
                    int t=getbel2(x); push2(nn,x); pop2(t,nn);
                }
            }
        }

        printf("%d\n",(int)Ans.size());
        for (auto v:Ans)
            if (v.first==-1) printf("1 %d\n",v.second);
            else printf("2 %d %d\n",v.first,v.second);
        Ans.clear();

        for (int i=1;i<=n;i++){
            assert(Q[i].size()==0);
            Q[i].clr();
        }
    }
    // cerr<<"OK\n";
    return 0;
}