#include<bits/stdc++.h>
using namespace std;
int ab[10];
struct node
{
int hp,num;//num为了方便跟踪每一个hp值
bool operator < (const node &x)const
{
return hp>x.hp;//按照血量降序排列
}
}tmp;
struct guaishou
{
int hp[10],ad[10],num;//保存数据的地方
using namespace std;
int ab[10];
struct node
{
int hp,num;//num为了方便跟踪每一个hp值
bool operator < (const node &x)const
{
return hp>x.hp;//按照血量降序排列
}
}tmp;
struct guaishou
{
int hp[10],ad[10],num;//保存数据的地方
}gs[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int sum=0;
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&ab[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
scanf("%d",&gs[i].hp[j]);
}
for(int j=1;j<=k;j++)
{
scanf("%d",&gs[i].ad[j]);
}
gs[i].num=i;
}
priority_queue<node>q[10];
for(int i=1;i<=n;i++)
{
q[1].push({gs[i].hp[1],i});//第一个数据放入队列
}
int ans=0;
while(1){
for(int i=1;i<k;i++)//每一个hp都要大于等于才可以击杀
{
while(!q[i].empty())
{
tmp=q[i].top();
if(tmp.hp<=ab[i])
{
int flag=tmp.num;
q[i+1].push({gs[flag].hp[i+1],flag});//把这一个条件满足的hp放入下一个队列中再次筛选
q[i].pop();
}
else
break;//剩余的这一次击杀不了
}
}
while(!q[k].empty())
{
tmp=q[k].top();
if(tmp.hp<=ab[k])
{
sum++;//可以击杀
int flag=tmp.num;
for(int i=1;i<=k;i++)
ab[i]+=gs[flag].ad[i];
q[k].pop();
}
else
break;
}
if(ans==sum)
break;//用来判重(与上一次循环时相同)
ans=sum;
}
printf("%d ",ans);
for(int i=1;i<=k;i++)
printf("%d%c",ab[i],i==k?' ':' ');
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int sum=0;
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&ab[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
scanf("%d",&gs[i].hp[j]);
}
for(int j=1;j<=k;j++)
{
scanf("%d",&gs[i].ad[j]);
}
gs[i].num=i;
}
priority_queue<node>q[10];
for(int i=1;i<=n;i++)
{
q[1].push({gs[i].hp[1],i});//第一个数据放入队列
}
int ans=0;
while(1){
for(int i=1;i<k;i++)//每一个hp都要大于等于才可以击杀
{
while(!q[i].empty())
{
tmp=q[i].top();
if(tmp.hp<=ab[i])
{
int flag=tmp.num;
q[i+1].push({gs[flag].hp[i+1],flag});//把这一个条件满足的hp放入下一个队列中再次筛选
q[i].pop();
}
else
break;//剩余的这一次击杀不了
}
}
while(!q[k].empty())
{
tmp=q[k].top();
if(tmp.hp<=ab[k])
{
sum++;//可以击杀
int flag=tmp.num;
for(int i=1;i<=k;i++)
ab[i]+=gs[flag].ad[i];
q[k].pop();
}
else
break;
}
if(ans==sum)
break;//用来判重(与上一次循环时相同)
ans=sum;
}
printf("%d ",ans);
for(int i=1;i<=k;i++)
printf("%d%c",ab[i],i==k?' ':' ');
}
return 0;
}