/*
TASK:flower
LANG:C++
*/

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

#define MAXN 128
#define min(a,b) ((a)<(b)?(a):(b))

typedef struct BigInt {
    int c[512];
    int N;
    BigInt() {
        N = 0;
    }
    BigInt(int i) {
        c[0] = i;
        N = 1;
    }
    void print(void) {
        for (int i = N - 1; i >= 0; i--) {
            printf("%d", c[i]);
        }
        printf("\n");
    }
    void minus(void) {
        int i = 0;
        while (c[i] == 0) {
            i++;
        }
        c[i]--;
        for (--i; i >=0; i--) {
            c[i] = 9;
        }
    }
}BigInt;



BigInt dp[128][128];
BigInt dp1ans, dp2ans;
int N, S, W, E;
int all;
int X;
int Y;

BigInt operator + (const BigInt &a, const BigInt &b) {
    BigInt c = BigInt();
    int ost = 0;
    int ii;
    for (ii = 0; ii < min(a.N, b.N); ii++) {
        c.c[ii] = a.c[ii] + b.c[ii] + ost;
        ost = c.c[ii] / 10;
        c.c[ii] %= 10;
    }
    if (a.N > b.N) {
        for (; ii < a.N; ii++) {
            c.c[ii] = a.c[ii] + ost;
            ost = c.c[ii] / 10;
            c.c[ii] %= 10;
        }
    }
    else {
        for (; ii < b.N; ii++) {
            c.c[ii] = b.c[ii] + ost;
            ost = c.c[ii] / 10;
            c.c[ii] %= 10;
        }
    }
    if (ost != 0) {
        c.c[ii++] = ost;
    }
    c.N = ii; 
    return c;
}

BigInt operator * (const BigInt &a, const int &b) {
    BigInt c = BigInt();
    int ost = 0;
    int ii;
    for (ii = 0; ii < a.N; ii++) {
        c.c[ii] = b*a.c[ii] + ost;
        ost = c.c[ii] / 10;
        c.c[ii] %= 10;
    }
    while (ost) {
        c.c[ii++] = ost;
        ost /= 10;
    }
    c.N = ii; //printf("-");
    //c.print();
    return c;
}

BigInt operator * (const BigInt &a, const BigInt &b) {
    BigInt c = BigInt();
    BigInt d;
    int ii;

    int st = 1;
    for (ii = 0; ii < a.N; ii++) {

        d = (b * (a.c[ii] * st));

        c = c + d;
        st *= 10;
    } 
    return c;
}

int main() {
    
//    freopen("in.in", "r", stdin);
//    freopen("out.out", "w", stdout);
    
    scanf("%d\n", &all);
    char c;
    for (int i = 0; i < all; i++) {
        scanf("%c%*c", &c);
        if (c == 'N') {
            N++;
        }
        else if (c == 'S') {
            S++;
        }
        else if (c == 'E') {
            E++;
        }
        else if (c == 'W') {
            W++;
        }
    }
    X = N + S;
    Y = E + W;
    
//=====================================================
    for (int i = 0; i <= N; i++) {
        for (int j = 1; j <= S; j++) {
            dp[i][j] = BigInt();
        }
    }
    for (int i = 0; i <= S; i++) {
        dp[i][0] = BigInt(1);
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= min(i,S); j++) {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }
    dp1ans = dp[N][S];
//=====================================================
    for (int i = 0; i <= W; i++) {
        for (int j = 1; j <= E; j++) {
            dp[i][j] = BigInt();
        }
    }
    for (int i = 0; i <= E; i++) {
        dp[i][0] = BigInt(1);
    }

    for (int i = 1; i <= W; i++) {
        for (int j = 1; j <= min(i,E); j++) {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }
    dp2ans = dp[W][E];
//=====================================================    
    for (int i = 1; i <= X; i++) {
        for (int j = 0; j <= Y; j++) {
            dp[i][j] = BigInt();
        }
    }

    for (int i = 0; i <= Y; i++) {
        dp[0][i] = BigInt(1);
    }

    for (int x = 1; x <= X; x++) {
        for (int y = 0; y <= Y; y++) {
            dp[x][y] = dp[x-1][y] + dp[x][y-1];
        }
    }
//=====================================================    
    
    dp1ans = dp1ans * dp2ans;   
    BigInt ans = dp1ans*dp[X][Y];
    ans.minus();
    ans.print();
    return 0;
}
