#include <bits/stdc++.h>
#pragma GCC target ("avx2,fma")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#define int long long
#define ll long long
#define ld long double
#define endl '\n'
#define st first
#define nd second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define ROF(i,r,l) for(int i=(r);i>=(l);i--)
using namespace std;
int inf=1000000000000000007;
//int mod=1000000007;
int mod1=998244353;
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif
const long long MOD = 998244353;
const long long HALF = 499122177;
const std::vector<long long> ntt_root = {1, 998244352, 911660635, 372528824, 929031873, 452798380, 922799308, 781712469, 476477967, 166035806, 258648936, 584193783, 63912897, 350007156, 666702199, 968855178, 629671588, 24514907, 996173970, 363395222, 565042129, 733596141, 267099868, 15311432};
const std::vector<long long> ntt_iroot = {1, 998244352, 86583718, 509520358, 337190230, 87557064, 609441965, 135236158, 304459705, 685443576, 381598368, 335559352, 129292727, 358024708, 814576206, 708402881, 283043518, 3707709, 121392023, 704923114, 950391366, 428961804, 382752275, 469870224};
void ntt(std::vector<long long> &A){
int N = A.size();
int M = __builtin_ctz(N);
for (int i = M - 1; i >= 0; i--){
for (int j = 0; j < N; j += (2 << i)){
long long z = 1;
for (int k = 0; k < (1 << i); k++){
long long a = A[j + k] + A[j + (1 << i) + k];
if (a >= MOD){
a -= MOD;
}
long long b = A[j + k] - A[j + (1 << i) + k];
if (b < 0){
b += MOD;
}
b *= z;
b %= MOD;
A[j + k] = a;
A[j + (1 << i) + k] = b;
z *= ntt_root[i + 1];
z %= MOD;
}
}
}
}
void ntt_inv(std::vector<long long> &A){
int N = A.size();
int M = __builtin_ctz(N);
for (int i = 0; i < M; i++){
for (int j = 0; j < N; j += (2 << i)){
long long z = 1;
for (int k = 0; k < (1 << i); k++){
A[j + (1 << i) + k] *= z;
A[j + (1 << i) + k] %= MOD;
long long a = A[j + k] + A[j + (1 << i) + k];
if (a >= MOD){
a -= MOD;
}
long long b = A[j + k] - A[j + (1 << i) + k];
if (b < 0){
b += MOD;
}
A[j + k] = a;
A[j + (1 << i) + k] = b;
z *= ntt_iroot[i + 1];
z %= MOD;
}
}
}
long long Ninv = 1;
for (int i = 0; i < M; i++){
Ninv *= HALF;
Ninv %= MOD;
}
for (int i = 0; i < N; i++){
A[i] *= Ninv;
A[i] %= MOD;
}
}
std::vector<long long> convolution(std::vector<long long> A, std::vector<long long> B){
int sz = A.size() + B.size() - 1;
int N = sz == 1 ? 1 : 1 << (32 - __builtin_clz(sz - 1));
A.resize(N);
B.resize(N);
ntt(A);
ntt(B);
std::vector<long long> ans(N);
for (int i = 0; i < N; i++){
ans[i] = A[i] * B[i] % MOD;
}
ntt_inv(ans);
ans.resize(sz);
return ans;
}
const int N=200007;
vector<pair<int,int>>G[N];
int w[N];
int DP[N][2];
vector<vector<int>>V[2];
vector<int>rek(int p,int l,int r)
{
if(l>r) return {1,0};
debug(l,sz(V[p]));
if(l==r) return V[p][l];
int m=(l+r)/2;
vector<int>L=rek(p,l,m);
vector<int>R=rek(p,m+1,r);
return conv(L,R);
}
void dfs(int v,int o,int T)
{
vector<vector<int>>X[2];
for(auto [u,t]:G[v])
{
if(u==o) continue;
dfs(u,v,t);
X[t].pb({DP[u][0],DP[u][1]});
}
V[0]=X[0],V[1]=X[1];
vector<int>V0=rek(0,0,sz(V[0])-1);
vector<int>V1=rek(1,0,sz(V[1])-1);
debug("XDD",v);
debug(V0,sz(V[0]));
debug(V1,sz(V[1]));
FOR(k,0,min(sz(V0),sz(V1))-1)
{
DP[v][0]=(DP[v][0]+V0[k]*V1[k])%mod;
if(w[v]==1&&k+1<sz(V0)) DP[v][0]=(DP[v][0]+V0[k+1]*V1[k]%mod)%mod;
if(w[v]==0&&k+1<sz(V1)) DP[v][0]=(DP[v][0]+V0[k]*V1[k+1]%mod)%mod;
if(T==0&&k+1<sz(V0)) DP[v][1]=(DP[v][1]+V0[k+1]*V1[k]%mod)%mod;
if(T==1&&k+1<sz(V1)) DP[v][1]=(DP[v][1]+V0[k]*V1[k+1]%mod)%mod;
if(T==w[v]) DP[v][1]=(DP[v][1]+V0[k]*V1[k]%mod)%mod;
else
{
if(T==1&&k+2<sz(V0)) DP[v][1]=(DP[v][1]+V0[k+2]*V1[k]%mod)%mod;
if(T==0&&k+2<sz(V1)) DP[v][1]=(DP[v][1]+V0[k]*V1[k+2]%mod)%mod;
}
}
debug(v,DP[v][0],DP[v][1]);
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string s;
int n;
cin>>n>>s;
FOR(i,1,n-1)
{
int a,b;
cin>>a>>b;
G[a].pb({b,0});
G[b].pb({a,1});
}
FOR(i,1,n) w[i]=(s[i-1]=='S');
dfs(1,0,0);
cout<<DP[1][0]<<endl;
return 0;
}