#include<bits/stdc++.h>
#define maxn 3000000
using namespace std;
struct trie_node{
int son[26];
int fail,flag,dep;
long long stat;
void init(){
memset(son,0,sizeof(son));
fail=flag=dep=0;
}
}tr[maxn];
queue <int> q;
int cnt,n,m,num;
char T[maxn];
void init(){
for(int i=0;i<=cnt;i++)tr[i].init();
cnt=0;
}
void insert(char *s){
int u=0,len=strlen(s);
for(int i=0;i<len;i++){
int v=s[i]-'a';
if(!tr[u].son[v])tr[u].son[v]=++cnt;
u=tr[u].son[v];
}
if(!tr[u].flag)tr[u].flag=++num;
}
void build(){
for(int i=0;i<26;i++){
if(tr[0].son[i])q.push(tr[0].son[i]);
}tr[0].dep=1;
while(!q.empty()){
int u=q.front();q.pop();
int Fail=tr[u].fail;
tr[u].stat=tr[Fail].stat;
if(tr[u].flag)tr[u].stat|=(1<<tr[u].dep);
for(int i=0;i<26;i++){
if(!tr[u].son[i])tr[u].son[i]=tr[Fail].son[i];
else{
tr[tr[u].son[i]].fail=tr[Fail].son[i];
tr[tr[u].son[i]].dep=tr[u].dep+1;
q.push(tr[u].son[i]);
}
}
}
}
int query(char *t){
int u=0,len=strlen(t),mx=0;
long long st=1;
for(int i=0;i<len;i++){
u=tr[u].son[t[i]-'a'];
st<<=1;
if(tr[u].stat&st)st|=1,mx=i+1;
}
return mx;
}
int main(){
scanf("%d%d",&n,&m);
init();
for (int i=1;i<=n;i++) {
scanf("%s",T);
insert(T);
}
build();
for(int i=1;i<=m;i++) {
scanf("%s",T);
printf("%d\n",query(T));
}
return 0;
}