#include<bits/stdc++.h>
#define ci const int
#define ll long long
using namespace std;
char buf[1<<20],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
int read(){int res(0);char ch(getchar());while(ch<48||ch>57)ch=getchar();while(ch>=48&&ch<=57)res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;}
void out(ci x){
if(x>9)out(x/10);
putchar(x%10+48);
}
int n,q;
namespace sol1{
ci mod=998244353,V=520,M=2080;
inline void add(int &x,ci v){
x+=v,x-=x<mod?0:mod;
}
inline void sub(int &x,ci v){
x-=v,x+=x<0?mod:0;
}
ll qk(ll x,int y=mod-2){
ll ans=1;
while(y){
if(y&1)ans=ans*x%mod;
x=x*x%mod,y>>=1;
}
return ans;
}
int cnt[1<<15];
int co[16][525];
int pw[2100][525];
struct DAT{
int co[6][525];
int val[6][525][2100];//val[i][<=k]
int g[525][1<<5][2100];//g[k][s]
int f[1<<5][2100],F[1<<5][525];//f[s]
void Solve(){
for(int i=1;i<=5;++i)
for(int x=1;x<=M;++x)
for(int j=0;j<=V;++j)
val[i][j][x]=((ll)pw[x][j]*co[i][j]+(j?val[i][j-1][x]:0))%mod;
F[0][0]=1;
for(int s=1;s<1<<5;++s){
ci b=__builtin_ctz(s&-s)+1;
for(int i=0;i<=V;++i)
for(int j=0;i+j<=V;++j)
add(F[s][i+j],(ll)F[s^(s&-s)][i]*co[b][j]%mod);
}
for(int s=0;s<1<<5;++s)
for(int x=1;x<=M;++x)
for(int j=0;j<=V;++j)
add(f[s][x],(ll)F[s][j]*pw[x][j]%mod);
for(int k=1;k<=V;++k){
for(int x=1;x<=M;++x)g[k][0][x]=1;
for(int s=1;s<1<<5;++s){
if(cnt[s]*k>V)continue;
ci sv=s&-s;
ci b=__builtin_ctz(sv)+1;
for(int x=1;x<=M;++x)
g[k][s][x]=mod-(ll)g[k][s^sv][x]*val[b][k-1][x]%mod;
}
for(int s=0;s<1<<5;++s)
for(int x=1;x<=M;++x)
g[k][s][x]=(ll)g[k][s][x]*f[s^31][x]%mod;
for(int i=1;i<=5;++i)
for(int s=0;s<1<<5;++s)
if(s>>(i-1)&1)
for(int x=1;x<=M;++x)
add(g[k][s][x],g[k][s^(1<<i-1)][x]);
}
}
}DL,DM,DR;
int la[2100][2100],poly[2100],tmp[2100];
int main(){
for(int i=1;i<=15;++i)co[i][0]=1;
for(int i=1;i<=n;++i){
for(int k=read();k;--k){
ci b=read(),c=read();
for(int j=b;j<=V;++j)add(co[i][j],co[i][j-b]);
for(int j=V;~j;--j)co[i][j]=(co[i][j]-(j>=(c+1)*b?co[i][j-(c+1)*b]:0)+mod)%mod;
}
}
for(int s=0;s<1<<15;++s)cnt[s]=cnt[s>>1]+(s&1);
for(int x=1;x<=M;++x){
pw[x][0]=1;
for(int i=1;i<=V;++i)pw[x][i]=(ll)pw[x][i-1]*x%mod;
}
for(int i=1;i<=5;++i)
for(int j=0;j<=V;++j)
DL.co[i][j]=co[i][j],
DM.co[i][j]=co[i+5][j],
DR.co[i][j]=co[i+10][j];
DL.Solve(),DM.Solve(),DR.Solve();
poly[0]=1;
for(int i=1;i<=M;++i)
for(int j=M;~j;--j)
poly[j]=((j?poly[j-1]:0)-(ll)i*poly[j]%mod+mod)%mod;
for(int i=1;i<=M;++i){
for(int j=0;j<=M;++j)tmp[j]=poly[j];
for(int j=M;j;--j)la[i][j-1]=tmp[j],add(tmp[j-1],(ll)tmp[j]*i%mod);
int co=1;
for(int j=1;j<=M;++j)if(i!=j)co=(ll)co*(i-j+mod)%mod;
co=qk(co);
for(int j=0;j<=M;++j)la[i][j]=(ll)la[i][j]*co%mod;
for(int j=1;j<=M;++j)add(la[i][j],la[i][j-1]);
}
while(q--){
int s1=0,s2=0,s3=0;
for(int i=1;i<=n;++i){
char c=getchar();
while(c!='0'&&c!='1')c=getchar();
if(c=='1'){
if(i<=5)s1|=1<<i-1;
else if(i<=10)s2|=1<<i-5-1;
else s3|=1<<i-10-1;
}
}
ci m=read(),k=read();
if((cnt[s1]+cnt[s2]+cnt[s3])*k>m){
puts("0");
continue;
}
__uint128_t ans=0;
for(int x=1;x<=M;++x){
ans+=(__uint128_t)DL.g[k][s1][x]*DM.g[k][s2][x]*DR.g[k][s3][x]*la[x][m];
if((x&127)==0||x==M)ans%=mod;
}
out(ans%mod),putchar(10);
}
return 0;
}
}
namespace sol1{
ci mod=1e9+7,V=520,M=2080;
inline void add(int &x,ci v){
x+=v,x-=x<mod?0:mod;
}
inline void sub(int &x,ci v){
x-=v,x+=x<0?mod:0;
}
ll qk(ll x,int y=mod-2){
ll ans=1;
while(y){
if(y&1)ans=ans*x%mod;
x=x*x%mod,y>>=1;
}
return ans;
}
int cnt[1<<15];
int co[16][525];
int pw[2100][525];
struct DAT{
int co[6][525];
int val[6][525][2100];//val[i][<=k]
int g[525][1<<5][2100];//g[k][s]
int f[1<<5][2100],F[1<<5][525];//f[s]
void Solve(){
for(int i=1;i<=5;++i)
for(int x=1;x<=M;++x)
for(int j=0;j<=V;++j)
val[i][j][x]=((ll)pw[x][j]*co[i][j]+(j?val[i][j-1][x]:0))%mod;
F[0][0]=1;
for(int s=1;s<1<<5;++s){
ci b=__builtin_ctz(s&-s)+1;
for(int i=0;i<=V;++i)
for(int j=0;i+j<=V;++j)
add(F[s][i+j],(ll)F[s^(s&-s)][i]*co[b][j]%mod);
}
for(int s=0;s<1<<5;++s)
for(int x=1;x<=M;++x)
for(int j=0;j<=V;++j)
add(f[s][x],(ll)F[s][j]*pw[x][j]%mod);
for(int k=1;k<=V;++k){
for(int x=1;x<=M;++x)g[k][0][x]=1;
for(int s=1;s<1<<5;++s){
if(cnt[s]*k>V)continue;
ci sv=s&-s;
ci b=__builtin_ctz(sv)+1;
for(int x=1;x<=M;++x)
g[k][s][x]=mod-(ll)g[k][s^sv][x]*val[b][k-1][x]%mod;
}
for(int s=0;s<1<<5;++s)
for(int x=1;x<=M;++x)
g[k][s][x]=(ll)g[k][s][x]*f[s^31][x]%mod;
for(int i=1;i<=5;++i)
for(int s=0;s<1<<5;++s)
if(s>>(i-1)&1)
for(int x=1;x<=M;++x)
add(g[k][s][x],g[k][s^(1<<i-1)][x]);
}
}
}DL,DM,DR;
int la[2100][2100],poly[2100],tmp[2100];
int main(){
for(int i=1;i<=15;++i)co[i][0]=1;
for(int i=1;i<=n;++i){
for(int k=read();k;--k){
ci b=read(),c=read();
for(int j=b;j<=V;++j)add(co[i][j],co[i][j-b]);
for(int j=V;~j;--j)co[i][j]=(co[i][j]-(j>=(c+1)*b?co[i][j-(c+1)*b]:0)+mod)%mod;
}
}
for(int s=0;s<1<<15;++s)cnt[s]=cnt[s>>1]+(s&1);
for(int x=1;x<=M;++x){
pw[x][0]=1;
for(int i=1;i<=V;++i)pw[x][i]=(ll)pw[x][i-1]*x%mod;
}
for(int i=1;i<=5;++i)
for(int j=0;j<=V;++j)
DL.co[i][j]=co[i][j],
DM.co[i][j]=co[i+5][j],
DR.co[i][j]=co[i+10][j];
DL.Solve(),DM.Solve(),DR.Solve();
poly[0]=1;
for(int i=1;i<=M;++i)
for(int j=M;~j;--j)
poly[j]=((j?poly[j-1]:0)-(ll)i*poly[j]%mod+mod)%mod;
for(int i=1;i<=M;++i){
for(int j=0;j<=M;++j)tmp[j]=poly[j];
for(int j=M;j;--j)la[i][j-1]=tmp[j],add(tmp[j-1],(ll)tmp[j]*i%mod);
int co=1;
for(int j=1;j<=M;++j)if(i!=j)co=(ll)co*(i-j+mod)%mod;
co=qk(co);
for(int j=0;j<=M;++j)la[i][j]=(ll)la[i][j]*co%mod;
for(int j=1;j<=M;++j)add(la[i][j],la[i][j-1]);
}
while(q--){
int s1=0,s2=0,s3=0;
for(int i=1;i<=n;++i){
char c=getchar();
while(c!='0'&&c!='1')c=getchar();
if(c=='1'){
if(i<=5)s1|=1<<i-1;
else if(i<=10)s2|=1<<i-5-1;
else s3|=1<<i-10-1;
}
}
ci m=read(),k=read();
if((cnt[s1]+cnt[s2]+cnt[s3])*k>m){
puts("0");
continue;
}
__uint128_t ans=0;
for(int x=1;x<=M;++x){
ans+=(__uint128_t)DL.g[k][s1][x]*DM.g[k][s2][x]*DR.g[k][s3][x]*la[x][m];
if((x&127)==0||x==M)ans%=mod;
}
out(ans%mod),putchar(10);
}
return 0;
}
}
int main(){
n=read(),q=read();
if(read()==998244353)return sol1::main();
else return sol2::main();
}