#include<bits/stdc++.h>
using namespace std;
namespace fastio
{
constexpr int S1=1<<20;
char buf1[S1],*l1,*r1;
inline char getc()
{
return ((l1==r1&&(r1=(l1=buf1)+fread(buf1,1,S1,stdin)),l1!=r1)?*l1++:EOF);
}
template<typename T=int>inline T read()
{
T x=0,y=1;
char c=getc();
while(c<'0'||c>'9')
{
if(c=='-')
y=-1;
c=getc();
}
while(c>='0'&&c<='9')
{
x=c-'0'+x*10;
c=getc();
}
return x*y;
}
inline double readdb()
{
double x=0,y=1;
char c=getc();
while(c<'0'||c>'9')
{
if(c=='-')
y=-1;
c=getc();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getc();
}
if(c=='.')
{
double r=.1;
for(c=getc();c>='0'&&c<='9';c=getc())
{
x+=r*(c-'0');
r*=.1;
}
}
return x*y;
}
inline int readstr(char*a)
{
int n=1;
for(*a=getc();isspace(*a);*a=getc());
for(*(++a)=getc();!isspace(*a);*(++a)=getc())
n++;
*a=0;
return n;
}
constexpr int S2=1<<20;
char buf2[S2],*l2=buf2;
inline void putc(char c)
{
l2==buf2+S2&&(fwrite(buf2,1,S2,stdout),l2=buf2),*l2++=c;
}
int _st[22];
template<typename T>inline void write(T x,char end='\n')
{
if(x<0)
putc('-'),x=-x;
int tp=0;
do
_st[++tp]=x%10;
while(x/=10);
while(tp)
putc(_st[tp--]+'0');
if(end)
putc(end);
}
constexpr int DIGIT=3;
constexpr long long _p=pow(10,DIGIT);
inline void write_db(double y,char end='\n')
{
if(y<0)
putc('-'),y=-y;
long long x=round(y*_p);
write(x/_p),putc('.');
x%=_p;
for(int i=1;i<=DIGIT;i++)
_st[i]=x%10,x/=10;
for(int i=DIGIT;i;i--)
putc(_st[i]+'0');
if(end)
putc(end);
}
inline void ps(const char*s,char end='\n')
{
for(auto p=s;*p;p++)
putc(*p);
if(end)
putc(end);
}
struct end
{
~end()
{
fwrite(buf2,1,l2-buf2,stdout);
}
}ender;
}
using fastio::getc;
using fastio::read;
using fastio::readdb;
using fastio::readstr;
using fastio::putc;
using fastio::write;
using fastio::write_db;
using fastio::ps;
constexpr __int128 INF=(__int128)(1ll<<61)*(1ll<<61);
constexpr int MN=100005,MM=20005,MW=65;
int n,m,tot[MW],t1[MW],ch[MW],tch[MN],len[MW],pe[MW][MN],p0[MN];
bool va[MW];
vector<long long>a,b,b0;
long long w[MN];
__int128 sum,res[MW],ans;
struct myvec
{
int cnt,a[MM][MW];
long long b[MM][MW];
void clear()
{
cnt=0;
}
void push(vector<pair<int,long long>>v)
{
sort(v.begin(),v.end());
cnt++;
a[cnt][0]=v.size();
for(int i=0;i<v.size();i++)
a[cnt][i+1]=v[i].first+1,b[cnt][i+1]=v[i].second;
}
void output()
{
write(cnt);
for(int i=1;i<=cnt;i++)
{
write(a[i][0]);
for(int j=1;j<=a[i][0];j++)
write(a[i][j],' ');
putc('\n');
for(int j=1;j<=a[i][0];j++)
write(b[i][j],' ');
putc('\n');
}
}
}V;
inline bool cmp(int x,int y)
{
return w[x]>w[y];
}
inline __int128 calck(vector<long long>a)
{
__int128 ans=0;
for(int j=60;~j;j--)
{
int t=0;
for(int i=0;i<n;i++)
t+=((a[i]>>j)&1);
if(~t&1)
{
ans+=(__int128)(1ll<<j)*t;
tot[j]=t;
continue;
}
ans+=(__int128)(1ll<<j)*(t+1);
tot[j]=t+1;
long long mx=-1;
int p=0;
for(int i=0;i<n;i++)
if(~(a[i]>>j)&1)
{
long long b=a[i]&((1ll<<j)-1);
if(b>mx)
mx=b,p=i;
}
a[p]=0;
}
return ans;
}
inline void addch(int i)
{
ch[++*ch]=i;
tch[i]++;
va[*ch]=1;
for(int j=1;j<*ch;j++)
if(ch[j]==i)
{
va[*ch]=0;
break;
}
}
inline void popch()
{
tch[ch[*ch]]--;
--*ch;
}
void dfs(int w)
{
if(w<0)
{
vector<pair<int,long long>>v;
for(int i=1;i<=*ch;i++)
if(va[i])
v.emplace_back(ch[i],b[ch[i]]-a[ch[i]]);
V.push(v);
m--;
return;
}
int t=t1[w];
for(int i=1;i<=*ch;i++)
if(va[i])
t+=((b[ch[i]]>>w)&1)-((b0[ch[i]]>>w)&1);
if(t+(t&1)!=tot[w])
return;
if(~t&1)
{
dfs(w-1);
return;
}
int lam=m+1;
for(int I=1;I<=len[w]&&m&&lam>m;I++)
{
int i=pe[w][I];
if(tch[i])
continue;
lam=m;
addch(i);
long long ti=b[i];
if(w)
b[i]=((b[i]>>w)|1)<<w;
else
b[i]|=1;
dfs(w-1);
b[i]=ti;
popch();
}
for(int I=1;I<=*ch&&m&&lam>m;I++)
{
if(!va[I])
continue;
lam=m;
int i=ch[I];
addch(i);
long long ti=b[i];
if(w)
b[i]=((b[i]>>w)|1)<<w;
else
b[i]|=1;
dfs(w-1);
b[i]=ti;
popch();
}
}
inline void calcv(vector<long long>_b)
{
b0=b=_b;
if(calck(b)!=ans)
return;
for(int j=60;~j;j--)
{
t1[j]=len[j]=0;
for(int i=0;i<n;i++)
if(~(b[i]>>j)&1)
pe[j][++len[j]]=i,w[i]=b[i]&((1ll<<j)-1);
else
t1[j]++;
sort(pe[j]+1,pe[j]+len[j]+1,cmp);
}
dfs(60);
}
inline void work()
{
n=read(),m=read();
a.resize(n);
for(int i=0;i<n;i++)
a[i]=read<long long>(),sum+=a[i];
int j,t;
for(j=60;~j;j--)
{
t=0;
for(int i=0;i<n;i++)
t+=((a[i]>>j)&1);
if(t&1)
break;
}
if(j>=0&&t==n)
{
int E=j;
ans=INF;
for(int j=60;j>E;j--)
{
vector<long long>b=a;
int t=0;
for(int i=0;i<n;i++)
t+=(b[i]>>j)&1;
if(t+2>n)
{
res[j]=INF;
continue;
}
long long mx=-1;
int p;
for(int i=0;i<n;i++)
if(~(b[i]>>j)&1)
{
long long v=b[i]&((1ll<<j)-1);
if(v>mx)
mx=v,p=i;
}
b[p]=((b[p]>>j)|1)<<j;
mx=-1;
for(int i=0;i<n;i++)
if(~(b[i]>>j)&1)
{
long long v=b[i]&((1ll<<j)-1);
if(v>mx)
mx=v,p=i;
}
b[p]=((b[p]>>j)|1)<<j;
res[j]=calck(b);
ans=min(ans,res[j]);
}
write(ans-sum);
for(int k=60;k>E;k--)
{
if(res[k]!=ans)
continue;
vector<long long>b=a;
int K=0;
for(int i=0;i<n;i++)
if(~(b[i]>>k)&1)
p0[++K]=i,w[i]=b[i]&((1ll<<k)-1);
sort(p0+1,p0+K+1,cmp);
int lalam=m+1;
for(int I=1;I<=K&&m&&lalam>m;I++)
{
lalam=m;
int lam=m+1,i=p0[I];
long long ti=b[i];
for(int J=I+1;J<=K&&m&&lam>m;J++)
{
int j=p0[J];
lam=m;
addch(i),addch(j);
long long tj=b[j];
b[i]=((b[i]>>k)|1)<<k;
b[j]=((b[j]>>k)|1)<<k;
calcv(b);
b[i]=ti,b[j]=tj;
popch(),popch();
}
}
}
V.output();
}
else
{
ans=calck(a);
write(ans-sum);
calcv(a);
V.output();
}
}
inline void clr()
{
sum=0;
V.clear();
}
int main()
{
read();
int T=read();
while(T--)
work(),clr();
return 0;
}