#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m, son[1000][30], son1[1000][30], idx, nxt[1000], E[2000005], ee[1000];
pair <int, char> e[1000];
char s[25], t[2000005];
vector <int> v[30];
queue <int> q;
void insert(){
int l = strlen(s + 1), p = 0;
for(int i = 1; i <= l; i ++){
if(son[p][s[i] - 'a']);
else
son[p][s[i] - 'a'] = ++idx;
p = son[p][s[i] - 'a'];
}
e[p] = make_pair(l, s[l]);
}
void nxtt(){
for(int i = 0; i < 26; i ++){
if(son[0][i])
q.push(son[0][i]);
}
int p;
while(q.size()){
p = q.front();
for(int i = 0; i < 26; i ++){
if(son[p][i])
nxt[son[p][i]] = son[nxt[p]][i], q.push(son[p][i]);
else
son[p][i] = son[nxt[p]][i];
}
q.pop();
}
}
int answer(){
int l = strlen(t + 1), p = 0, ans = 0;
memset(E, 0, sizeof(E));
memset(ee, 0, sizeof(ee));
E[0] = 1;
for(int i = 1; i <= l; i ++){
int c = t[i] - 'a';
p = son[p][c];
int temp = p;
while(temp){
if(e[temp].first && ee[temp] == 0)
v[e[temp].second - 'a'].push_back(e[temp].first), ee[temp] = 1;
temp = nxt[temp];
}
for(int j = 0; j < v[c].size(); j ++)
if(E[i - v[c][j]] >= 0 && E[i - v[c][j]])
ans = i, E[i] = 1;
}
return ans;
}
int main(){
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i ++){
scanf("%s", s + 1);
insert();
}
nxtt();
for(int i = 1; i <= m; i ++){
scanf("%s", t + 1);
printf("%d\n", answer());
}
return 0;
}