#include using namespace std; #include using namespace atcoder; #pragma GCC target("avx") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define FASTIO cin.tie(0)->sync_with_stdio(0) using ll = long long; using mint = modint998244353; int main() { FASTIO; int N, M; string S; cin >> N >> M >> S; vector> G(N); for(int i = 0; i < M; ++i) { int a, b; cin >> a >> b; a--, b--; G[a].insert(b); G[b].insert(a); } int q = 0; for(int i = 0; i < N; ++i) { if(S[i] == '?') ++q; } vector pw(N + 1, 1); for(int i = 0; i < N; ++i) { pw[i + 1] = pw[i] * 26; } mint ans; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(i == j) continue; if(S[i] != 'a' && S[i] != '?') continue; if(S[j] != 'i' && S[j] != '?') continue; int co = 0, cq = 0; int s = (G[i].size() < G[j].size() ? i : j); int t = i + j - s; for(const int &k : G[s]) { if(!G[t].count(k)) continue; if(S[k] == 'o') ++co; if(S[k] == '?') ++cq; } int q2 = q - cq - (S[i] == '?') - (S[j] == '?'); if(cq == 0) { ans += pw[q2] * co; }else { ans += pw[q2] * pw[cq - 1] * (26 * co + cq); } } } cout << ans.val() << endl; }