//hdu 6092
/*
类似筛法的递推顺序,注意细节处理
有一个f数组,在指针指向f[i]时,保证此时f[i]记录的是用所有小于i的数字加和等于i的情况数
那么f[i]和b[i]的差值就是值为i的数字的个数
下面要开始递推,充分利用已经算出f数组元素
循环整个f数组(可以加个upper上界),此时任意f[j]的值都记录的是用小于i的数字加和为j的情况数
(注意不仅仅是下标小于i的f数组元素,因为易知小于i的数加和是可以大于i的。。)
此时枚举值为i的数字个数,利用其他f[j]递推
f[j+i*k]+=c(k,con(i))*f[j]
只有存在值为i数字时才开始枚举,所以总枚举次数不超过n次,而每次枚举时几乎循环整个f数组,故时间复杂度O(nm)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
const int MAXN=10005;
ll f[MAXN];
ll b[MAXN],a[MAXN];
ll cc[55][55];
int cases;
int con[MAXN];
int n,m,sum,upper;
void pushf(int now){
ll t[MAXN];
int tupper=upper;
fr(i,0,upper)
t[i]=f[i];
if(con[now])
for(int i=1;i<=con[now];i++)
for(int j=0;j<=upper;j++){
if(j+i*now<=m){
tupper=max(j+i*now,tupper);
f[j+i*now]+=cc[con[now]][i]*t[j];
}
}
upper=tupper;
}
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>cases;
cc[1][0]=cc[1][1]=1LL;
fr(i,2,52){
cc[i][0]=1LL;
for(int j=1;j<=i;j++)
cc[i][j]=cc[i-1][j-1]+cc[i-1][j];
}
while(cases--){
cin>>n>>m;
ms(f,0);
ms(con,0);
f[0]=1;
upper=sum=0;
fr(i,0,m)
cin>>b[i];
int now=1;
ll tsum=0;
while(sum<n&&tsum<m&&now<m){
con[now]=b[now]-f[now];
//cout<<"f="<<f[now]<<" con="<<con[now]<<" now="<<now<<" con="<<con[now]<<endl;
sum+=con[now];
tsum+=con[now]*now;
pushf(now++);
}
int connow=n;
fr(i,1,m){
fr(j,1,con[i]){
cout<<i;
connow--;
if(connow)
cout<<" ";
else{
cout<<endl;
break;
}
}
if(!connow)
break;
}
}
return 0;
}