#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll LLINF=0x3f3f3f3f3f3f3f3fLL;
const int mod=998244353;
const int MAX=6000+10;
ll qpow(ll a,ll b)
{
	ll res=1;
	while(b>0)
	{
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
ll inv(ll x){return qpow(x,mod-2);}
int fac[MAX],invfac[MAX];
void init_comb(int n)
{
	assert(n<MAX);
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
	invfac[n]=inv(fac[n]);
	for(int i=n-1;~i;i--) invfac[i]=1ll*invfac[i+1]*(i+1)%mod;
}
ll C(int n,int m)
{
	if(m>n||m<0||n<0) return 0;
	return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
ll A(int n,int m)
{
	if(m>n||m<0||n<0) return 0;
	return 1ll*fac[n]*invfac[n-m]%mod;
}
vector<int> mp[MAX];
char s[MAX];
ll pw26[MAX],pw25[MAX];
int main()
{
	int n,m,i,j,k,a,b,cnta,cnti,cntw,totw,noww;
	ll ans;
	pw25[0]=pw26[0]=1;
	for(i=1;i<MAX;i++)
	{
		pw25[i]=pw25[i-1]*25%mod;
		pw26[i]=pw26[i-1]*26%mod;
	}
	init_comb(MAX-10);
	scanf("%d%d",&n,&m);
	scanf("%s",s+1);
	for(i=1;i<=n;i++) mp[i].clear();
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		mp[a].push_back(b);
		mp[b].push_back(a);
	}
	totw=0;
	for(i=1;i<=n;i++) totw+=(s[i]=='?');
	ans=0;
	for(i=1;i<=n;i++)
	{
		if(s[i]!='o' && s[i]!='?') continue;
		cnta=cnti=cntw=0;
		if(s[i]=='?') noww=1;
		else noww=0;
		for(auto &to:mp[i])
		{
			if(s[to]=='a') cnta++;
			else if(s[to]=='i') cnti++;
			else if(s[to]=='?') cntw++;
		}
		noww+=cntw;
		for(j=cnta;j<=cnta+cntw;j++)
		{
			for(k=cnti;k<=cnti+(cnta+cntw)-j;k++)
			{
				ans+=1LL*j*k%mod
					*C(cntw,j-cnta)%mod
					*C(cntw-(j-cnta),k-cnti)%mod
					*pw25[cnta+cnti+cntw-j-k]%mod
					*pw26[totw-noww];
				ans%=mod;
			}
		}
	}
	printf("%lld\n",ans);
	return 0;
}