#include <bits/stdc++.h>
using namespace std;
#define FOR(i,k,n) for(int i = (int)(k); i < (int)(n); i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(a) a.begin(), a.end()
#define MS(m,v) memset(m,v,sizeof(m))
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template<class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template<class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/
const int dx[] = { -1, 0, 1, 0 }, dy[] = { 0, -1, 0, 1 };
//const int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 }, dy[] = { 0, -1, 1, -1, 1, 0, -1, 1 };
bool valid(int x, int y, int h, int w) { return (x >= 0 && y >= 0 && x < h&&y < w); }
int place(int x, int y, int w) { return w*x + y; }

typedef pii point;
typedef pair<point, int> state;

int h, w, p;
bool vis[51][51][4][1001];
string s;
vs fld;

bool check(state tmp, char con)
{
	if (con == 'N') return tmp.second == 0;
	if (con == 'W') return tmp.second == 1;
	if (con == 'S') return tmp.second == 2;
	if (con == 'E') return tmp.second == 3;
	if (con == 'C')
	{
		int x = tmp.first.first, y = tmp.first.second, dir = tmp.second;
		int nx = x + dx[dir], ny = y + dy[dir];
		if (!valid(nx, ny, h, w) || fld[nx][ny] != '#') return false;
		return true;
	}
	if (con == 'T') return true;
	assert(false);
}

int main()
{
	cin.sync_with_stdio(false); cout << fixed << setprecision(10);
	cin >> h >> w;
	fld.resize(h);
	REP(i, h) cin >> fld[i];
	cin >> s;
	vi g(s.size(), -1);
	stack<int> st1, st2;
	REP(i, s.size())
	{
		if (s[i] == '{') st1.push(i);
		if (s[i] == '[') st2.push(i);
		if (s[i] == '}')
		{
			int j = st1.top(); st1.pop();
			g[i] = j; g[j] = i;
		}
		if (s[i] == ']')
		{
			int j = st2.top(); st2.pop();
			g[i] = j; g[j] = i;
		}
	}
	MS(vis, false);
	point src, dst;
	REP(i, h)REP(j, w)
	{
		if (fld[i][j] == 's')
		{
			src = point(i, j);
			fld[i][j] = '.';
		}
		if (fld[i][j] == 'g')
		{
			dst = point(i, j);
			fld[i][j] = '.';
		}
	}
	state tmp(src, 0);
	bool ok = false;
	ll ans = 0, p = 0;
	while (1)
	{
		int x = tmp.first.first, y = tmp.first.second, dir = tmp.second;
		if (point(x, y) == dst)
		{
			ok = true;
			break;
		}
		if (p == s.size() || vis[x][y][dir][p]) break;
		vis[x][y][dir][p] = true;
		if (s[p] == '[' || s[p] == '{')
		{
			int tp = p;
			p++;
			bool til = false;
			if (s[p] == '~')
			{
				til = true;
				p++;
			}
			bool con = check(tmp, s[p]);
			if (til) con = !con;
			if (con) p++;
			else p = g[tp] + 1;
		}
		else if (s[p] == ']')
		{
			p++;
		}
		else if (s[p] == '}')
		{
			p = g[p];
		}
		else if (s[p] == '^' || s[p] == 'v' || s[p] == '<' || s[p] == '>')
		{
			ans++;
			int nx = x, ny = y;
			if (s[p] == '^')
			{
				nx += dx[dir], ny += dy[dir];
			}
			else if (s[p] == '<')
			{
				dir = (dir + 1) % 4;
			}
			else if (s[p] == 'v')
			{ 
				nx += dx[(dir + 2) % 4], ny += dy[(dir + 2) % 4];
			}
			else if (s[p] == '>')
			{
				dir = (dir + 3) % 4;
			}
			if (valid(nx, ny, h, w) && fld[nx][ny] == '.')
			{
				x = nx, y = ny;
			}
			tmp = state(point(x, y), dir);
			p++;
		}
		else assert(false);
	}
	if(ok) cout << ans << endl;
	else cout << -1 << endl;
	return 0;
}