#include <bits/stdc++.h>
#define rep(i, l, r) for (int i=(l); i<=(r); ++i)
#define per(i, r, l) for (int i=(r); i>=(l); --i)
#define LB() printf ("TAG\n")
#define N ((int)(1e7+5))
#define M 10005
#define INF 0x7fffffff
using namespace std;
template <typename Tp> inline void to_max (Tp &x, const Tp &y) { if (y > x) x = y; return ; }
template <typename Tp> inline void to_min (Tp &x, const Tp &y) { if (y < x) x = y; return ; }
inline int lowbit (const int &x) { return x & (-x) ; }
int n, m, tot = 1, nxt[N], c[N][4];
char s[N], t[M][105];
bool f[N];
queue <int> q;
int modify (char c) {
if (c == 'E') return 0;
if (c == 'S') return 1;
if (c == 'W') return 2;
if (c == 'N') return 3;
return -1;
}
void insert (int k) {
int u = 1, len = strlen (t[k]+1);
rep (i, 1, len) {
int e = modify (t[k][i]);
if (!c[u][e]) c[u][e] = ++tot;
u = c[u][e];
}
return ;
}
void bfs () {
rep (i, 0, 3) c[0][i] = 1;
nxt[1] = 0; q.push (1);
while (!q.empty ()) {
int u = q.front (); q.pop ();
rep (i, 0, 3) {
if (!c[u][i]) c[u][i] = c[nxt[u]][i];
else {
q.push (c[u][i]);
int v = nxt[u];
while (v > 1 && !c[v][i]) v = nxt[v];
nxt[c[u][i]] = c[v][i];
}
}
}
return ;
}
void find () {
int u = 1;
rep (i, 1, n) {
int e = modify (s[i]), v = c[u][e];
while (v > 1 && !f[v]) {
f[v] = true;
v = nxt[v];
}
u = c[u][e];
}
return ;
}
void count (int k) {
int u = 1, len = strlen (t[k]+1), ans = 0;
rep (i, 1, len) {
int e = modify (t[k][i]);
u = c[u][e];
if (f[u]) ans = i;
}
printf ("%d\n", ans);
return ;
}
int main () {
scanf ("%d%d", &n, &m);
scanf ("%s", s+1);
rep (i, 1, m) {
scanf ("%s", t[i]+1);
insert (i);
}
bfs (); find ();
rep (i, 1, m) count (i);
return 0;
}