#ifdef LOCAL #define _GLIBCXX_DEBUG #endif #include #include using namespace atcoder; using namespace std; #define ll long long #define rep(i,n) for(ll i=0;i<(ll)n;i++) #define all(v) v.begin(),v.end() const ll INF = (ll)2e18; int main(){ cin.tie(0); ios::sync_with_stdio(false); ll N, M; cin >> N >> M; string S; cin >> S; ll mod = 998244353; vector A(M), B(M); vector> G(N); vector cnt_i(N, 0); vector cnt_a(N, 0); vector cnt_question(N, 0); rep(i,M){ cin >> A[i] >> B[i]; A[i]--; B[i]--; G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]); if(S[A[i]]=='a'){ cnt_a[B[i]]++; } else if(S[A[i]]=='i'){ cnt_i[B[i]]++; } else if(S[A[i]]=='?'){ cnt_question[B[i]]++; } if(S[B[i]]=='a'){ cnt_a[A[i]]++; } else if(S[B[i]]=='i'){ cnt_i[A[i]]++; } else if(S[B[i]]=='?'){ cnt_question[A[i]]++; } } ll q = 0; rep(i,N){ if(S[i]=='?'){ q++; } } // rep(i,N){ // cout << cnt_a[i] << ' '; // } // cout << endl; // rep(i,N){ // cout << cnt_i[i] << ' '; // } // cout << endl; // rep(i,N){ // cout << cnt_question[i] << ' '; // } // cout << endl; ll ans = 0; rep(i,N){ if(S[i]=='o'||S[i]=='?'){ ll x = cnt_a[i]; ll y = cnt_i[i]; ll z = cnt_question[i]; ll sum = x*((y+z)*(z+1)%mod-z)%mod; sum = (sum + mod) % mod; rep(b,z+1){ ll tmp = 0; tmp += x * (y + z - b) % mod * (z - b) % mod + (-x + y + z - b) * (z - b) % mod * (z - b + 1) % mod * inv_mod(2, mod) % mod - inv_mod(6, mod) * (z - b) % mod * (z - b + 1) % mod * (2 * (z - b) + 1) % mod; tmp %= mod; tmp *= 2; tmp = (tmp + mod) % mod; sum = (sum + tmp) % mod; } sum = sum * pow_mod(26, q - z - (S[i] == '?'), mod) % mod; ans += sum; ans %= mod; ans = (ans + mod) % mod; } } cout << ans << endl; }