/*
TASK:flower
LANG:C++
*/
#include<stdio.h>
#include<vector>
#include<algorithm>

#define maxn 110
#define MAX(a, b) (((a)<(b))?(b):(a))
#define MIN(a, b) (((a)<(b))?(a):(b))

using namespace std;

// Posveshtava se na moqta liubima Ana, koqto e vinagi s men,
// dori kogato pisha dp s dylgi 4isla na systezanie :)

void solve();
void input();
vector <int> addition(vector <int> v1, vector <int> v2);
vector <int> multiply(vector <int> v1, vector <int> v2);
vector <int> mul(int d, vector <int> v);


int X, Y;
int N;
char m[maxn];
vector <int> c[maxn][maxn];
vector <int> cat[maxn];
vector <int> dp[maxn][maxn];


int main()
{
input();
//test();
solve();
return 0;
}

void solve()
{
int i, j;
int N;
vector <int> c1, c2;
vector <int> ans;


c[0][0].push_back(0);
c[0][1].push_back(1);
N = MAX(X+1, Y+1);

for(i = 1; i <= N; i++)
 {
 c[i][0].push_back(0);
 for(j = 1; j <= i; j++) c[i][j] = addition(c[i-1][j], c[i][j-1]);
 cat[i] = c[i][i];
 }


c1 = multiply(cat[X+1], cat[Y+1]);

dp[0][0].push_back(1);
for(i = 1; i <= 2*X; i++) dp[i][0].push_back(1);
for(i = 1; i <= 2*Y; i++) dp[0][i].push_back(1);

for(i = 1; i <= 2*X; i++)
 for(j = 1; j <= 2*Y; j++)
  dp[i][j] = addition(dp[i-1][j], dp[i][j-1]);

c2 = dp[2*X][2*Y];

ans = multiply(c1, c2);

for(i = ans.size() - 1; i >= 0; i--)
 if(ans[i] == 0)
  ans[i] = 9;
 else
  {
  ans[i]--;
  break;
  }

  
for(i = 0; i < ans.size(); i++)
 printf("%d", ans[i]);
printf("\n");
}



vector <int> multiply(vector <int> v1, vector <int> v2)
{
int i, j, k;

vector <int> aux;
vector <int> result;

result.push_back(0);

for(i = v1.size() - 1, j = 0; i >= 0; i--, j++)
 {
 aux = mul(v1[i], v2);
 for(k = 0; k < j; k++) aux.push_back(0);
 result = addition(result, aux);
 }
return result;
}

vector <int> mul(int d, vector <int> v)
{
int i;
int sz = v.size();

reverse(v.begin(), v.end());
for(i = 0; i < sz; i++) v[i] *= d;
for(i = 0; i < sz-1; i++)
 {
 v[i+1] += v[i] / 10;
 v[i] %= 10;
 }

for(i = sz-1; ;i++)
 if(v[i] > 9)
  {
  v.push_back(v[i]/10);
  v[i] %= 10;
  }
 else break;
 
reverse(v.begin(), v.end());
return v;
}

vector <int> addition(vector <int> v1, vector <int> v2)
{
vector <int> ans;
int n1, n2;
int n_max, n;
int i;

reverse(v1.begin(), v1.end());
reverse(v2.begin(), v2.end());

n1 = v1.size();
n2 = v2.size();
n = MIN(n1, n2);
n_max = MAX(n1, n2);

for(i = 0; i < n; i++)
 ans.push_back(v1[i] + v2[i]);

for(i = n; i < n_max; i++)
 if(n1 < n2) ans.push_back(v2[i]);
 else ans.push_back(v1[i]);

for(i = 0; i < n_max-1; i++)
 {
 ans[i+1] += ans[i]/10;
 ans[i] %= 10;
 }

for(i = n_max - 1; ;i++)
 if(ans[i] > 9)
  {
  ans.push_back(ans[i] / 10);
  ans[i] %= 10;
  }
 else break;

reverse(ans.begin(), ans.end());
return ans;
}


void input()
{
char temp;
scanf("%d\n",&N);
for(int i = 0; i < N; i++)
 {
 scanf("%c%c", &m[i], &temp);
 if(m[i] == 'N' || m[i] == 'S') X++;
 else Y++;
 }
X /= 2; Y /= 2;
}

/*
void test()
{
int i, j;
vector <int> v1, v2, v;

v1.push_back(9);
v1.push_back(9);
v1.push_back(9);
v1.push_back(9);

v2.push_back(7);
v2.push_back(7);
v2.push_back(7);


v = addition(v1, v2);
for(i = 0; i < v.size(); i++)
 printf("%d ", v[i]);
printf("\n");
}
*/

