#include<bits/stdc++.h>
#define N 10000005
#define Z 4
#define ll long long
#define ms(ar,x) memset(ar,x,sizeof(ar))
#define mc(ar1,ar2) memcpy(ar1,ar2,sizeof(ar2))
#define fn(i,st,ed) for(int i=st;i<=ed;i++)
#define fd(i,st,ed) for(int i=st;i>=ed;i--)
#define fg(i,x,head,e) for(int i=head[x];~i;i=e[i].nxt)
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
int getnum(char c){return (c=='E'?0:(c=='S'?1:(c=='W'?2:3)));}
class TRIE{
public:
void insert(char *s){
int len=strlen(s);
int u=1;
fn(i,0,len-1){
int c=getnum(s[i]);
if(!tr[u][c])tr[u][c]=++tot;
u=tr[u][c];
}
}
int query(char *s){
int len=strlen(s);
int ans=0,u=1;
fn(i,0,len-1){int c=getnum(s[i]);
u=tr[u][c];
if(End[u])ans=i;
}
return ans;
}
protected:
int tr[N][Z],End[N];
int tot;
};
class Aho_Corasick_Automaton:public TRIE{
public:
Aho_Corasick_Automaton(){tot=1;}
void clear(){tot=1;ms(tr,0);ms(End,0);ms(fail,0);}
void build(){
fn(i,0,3)tr[0][i]=1;
q.push(1),fail[1]=0;
while(!q.empty()){
int u=q.front();q.pop();
fn(i,0,3){
if(tr[u][i]){
q.push(tr[u][i]);
int v=fail[u];
//while(v>1&&!tr[v][i])v=fail[v];
fail[tr[u][i]]=tr[v][i];
}
else tr[u][i]=tr[fail[u]][i];
}
}
}
void pre(char *s){
int len=strlen(s);
int u=1;
fn(i,0,len-1){
int c=getnum(s[i]);u=tr[u][i];
int k=u;
while(k>1&&!End[k])End[k]=1,k=fail[k];
}
}
private:
queue<int>q;
int fail[N];
};
Aho_Corasick_Automaton ACA;
char s[N],temp[100005][105];
int main(){
int n=read(),m=read();
scanf("%s",s);
fn(i,1,m){
scanf("%s",temp[i]);
ACA.insert(temp[i]);
}
ACA.build();ACA.pre(s);
fn(i,1,m)printf("%d\n",ACA.query(temp[i]));
return 0;
}