#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
ll 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-48;ch=getchar();}
return x*f;
}
ll t,n,l;
string s;
bitset<500005>fl;
ll pri[500005],cnt=0;
ll a[20],ca;
int st;
void pre(){//筛质数
cnt=0;
fl=0;
for(int i=2;i<=n;i++){
if(!fl[i]){
pri[++cnt]=i;
for(int j=2;j*i<=n;j++){
fl[j*i]=1;
}
}
}
}
void fpri(){//判断小于等于n的质数
ca=0;
for(int i=1;i<=cnt;i++){
if(l%pri[i]==0) a[++ca]=pri[i];
}
}
bool f[500005];
bool ok=0;
vector<int>gz[500005];
vector<int>one;
int ans[500005];
int main(){
cin>>t;
while(t){
t--;
cin>>n>>l>>s;
if(l==0){
cout<<n<<' ';
for(int i=1;i<=n-1;i++) cout<<i<<' ';putchar('\n');
continue;
}
pre();
fpri();
//for(int i=1;i<=ca;i++) cout<<a[i]<<' ';putchar('\n');
st=0;
one.clear();
//求1的个数
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
st++;
one.push_back(i+1);
}
}
//cout<<st<<'\n';
//初始化
for(int i=1;i<=n;i++) f[i]=0;
for(int i=1;i<=ca;i++) f[a[i]]=1;
for(int i=1;i<=n;i++) gz[i].clear();
for(int i=1;i<=ca;i++) gz[a[i]].push_back(a[i]);
//背包
for(int i=1;i<=n;i++){
if(f[i]){
for(int j=1;j<=ca;j++){
if(i+a[j]<=n && !f[i+a[j]]){
for(int k=0;k<gz[i].size();k++) gz[i+a[j]].push_back(gz[i][k]);
gz[i+a[j]].push_back(a[j]);
f[i+a[j]]=1;
}
}
}
}
//for(int i=1;i<=n;i++) cout<<f[i]<<' ';putchar('\n');
ok=0;
ll gs;
for(int m=st;m<=n;m++){
if(m==n-1) continue;
if(f[m]){
ok=1;
gs=m;
break;
}
}
if(!ok) cout<<"-1\n";
else{
//cout<<gs<<'\n';
for(int i=1;i<=n;i++) ans[i]=i;
//把0加进来凑数
for(int i=0;one.size()<n;i++){
if(s[i]=='0') one.push_back(i+1);
}
int j=0;
//for(int i=0;i<gz[gs].size();i++) cout<<gz[gs][i]<<' ';putchar('\n');
gz[gs].push_back(n-gs);
//循环位移
for(int i=0;i<gz[gs].size();i++){
int lh=gz[gs][i];
if(lh==0) continue;
//one[j]~one[j+lh-1];
ll tmp=ans[one[j]];
for(int k=j;k<=j+lh-1-1;k++){
ans[one[k]]=ans[one[k+1]];
}
ans[one[j+lh-1]]=tmp;
j+=lh;
}
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';putchar('\n');
}
}
return 0;
}
救救孩子。。。