RT
#include <bits/stdc++.h>
#define int long long
#define Arr std::vector
const int N = 305;
const int M = 2e6 + 5;
int T, n, m, k, a[M], st[N][2], t[2 * N], opt;// 0 -> bott 1 -> top
bool flag = false;
Arr<int> ST[4];
Arr<int> stk[N];
Arr<int> emt, type, ans1, ans2;
inline int read()
{
int w = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
w = (w << 3) + (w << 1) + (ch - 48);
ch = getchar();
}
return w * f;
}
void Init()
{
opt = 0;
flag = false;
emt.clear(), type.clear(), ans1.clear(), ans2.clear();
for (int i = 1; i <= n + 3; i++) stk[i].clear(), ST[i].clear();
for (int i = 1; i <= n + 3; i++)
{
st[i][0] = st[i][1] = 0;
}
for (int i = 1; i < n; i++) emt.push_back(i);
}
void Print()
{
printf("%lld\n", opt);
for (int i = 0; i < opt; i++)
{
int Type = type[i], Ans1 = ans1[i], Ans2 = ans2[i];
if (Ans2 == -1)
{
printf("%lld %lld\n", Type, Ans1);
}
else
{
printf("%lld %lld %lld\n", Type, Ans1, Ans2);
}
}
}
void dfs(int step)
{
if (flag) return ;
if (step == m + 1)
{
int Siz = 0;
for (int i = 1; i <= m; i++) Siz += ST[i].size();
if (Siz == 0 && !flag)
{
Print();
flag = true;
return ;
}
return ;
}
for (int i = 1; i <= n; i++)
{
if (flag) return ;
int siz = ST[i].size();
if (siz != 0)
{
int tmp = *ST[i].rbegin();
if (tmp == a[step])
{
ST[i].pop_back();
opt++;
type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
dfs(step + 1);
ST[i].push_back(tmp);
opt--;
type.pop_back(); ans1.pop_back(); ans2.pop_back();
if (flag) return ;
}
else
{
ST[i].push_back(a[step]);
opt++;
type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
dfs(step + 1);
ST[i].pop_back();
opt--;
type.pop_back(); ans1.pop_back(); ans2.pop_back();
if (flag) return ;
}
}
else
{
for (int j = 1; j <= n; j++)
{
if (i == j) continue;
int Siz = ST[j].size();
if (Siz == 0) continue;
int bott = ST[j][0];
if (bott == a[step])
{
ST[j].erase(ST[j].begin());
opt += 2;
type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
type.push_back(2); ans1.push_back(i); ans2.push_back(j);
dfs(step + 1);
ST[j].insert(ST[j].begin(), bott);
opt -= 2;
type.pop_back(); type.pop_back(); ans1.pop_back(); ans1.pop_back(); ans2.pop_back(); ans2.pop_back();
if (flag) return ;
}
}
ST[i].push_back(a[step]);
opt++;
type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
dfs(step + 1);
ST[i].pop_back();
opt--;
type.pop_back(); ans1.pop_back(); ans2.pop_back();
if (flag) return ;
}
}
if (flag) return ;
}
signed main()
{
T = read(); int tt = T;
while (T--)
{
n = read(), m = read(), k = read();
for (int i = 1; i <= m; i++) a[i] = read();
//Input
if (tt == 1001)
{
int op = 0;
Init();
for (int i = 1; i <= m; i++)
{
if (t[a[i]])
{
int plc = t[a[i]];
if (st[plc][0] == a[i])
{
op += 2;
type.push_back(1); ans1.push_back(n); ans2.push_back(-1);
type.push_back(2); ans1.push_back(plc); ans2.push_back(n);
st[plc][0] = 0;
if (st[plc][1])
{
st[plc][0] = st[plc][1];
st[plc][1] = 0;
emt.push_back(plc);
}
}
else if (st[plc][1] == a[i])
{
op++;
type.push_back(1); ans1.push_back(plc); ans2.push_back(-1);
st[plc][1] = 0;
emt.push_back(plc);
}
t[a[i]] = 0;
}//the stack have node
else
{
int stack = *emt.rbegin(); t[a[i]] = stack;
op++; type.push_back(1); ans1.push_back(stack); ans2.push_back(-1);
if (st[stack][0] == 0)
{
st[stack][0] = a[i];
}
else if (st[stack][1] == 0)
{
st[stack][1] = a[i];
emt.pop_back();
}
}
}
printf("%lld\n", op);
for (int i = 0; i < op; i++)
{
int Type = type[i], Ans1 = ans1[i], Ans2 = ans2[i];
if (Ans2 == -1)
{
printf("%lld %lld\n", Type, Ans1);
}
else
{
printf("%lld %lld %lld\n", Type, Ans1, Ans2);
}
}
}
if (tt == 3)
{
Init();
dfs(1);
}
}
return 0;
}