#include <bits/stdc++.h>
using namespace std;

typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef long long LL;
typedef pair<LL, LL> PLL;

#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second
template<class S, class T>
istream& operator>>(istream& is, pair<S,T>& p){
  return is >> p.FF >> p.SS;
}

const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

int H, W, N, sx, sy, gx, gy;
string dat[51];
string cmd;
int idx(int x, int y){
  return x+y*W;
}
bool vis[2510][4][1000];
int dx[] = {0,1,0,-1};
int dy[] = {-1,0,1,0};
using TI = tuple<int,int,int>;
int ans = 0;
bool isgoal(TI& st){
  return get<0>(st) == gx && get<1>(st) == gy;
}

int prog(int i, TI& st);
int sent(int i, TI& st);
int ifs(int i, TI& st);
int whiles(int i, TI& st);

int prog(int i, TI& st){
  while(i < N){
	int next = sent(i,st);
	if(next < 0) return -1;
	if(next == i) break;
	i = next;
  }
  return i;
}
int sent(int i, TI& st){
  int x, y, d;
  tie(x,y,d) = st;
  if(vis[idx(x,y)][d][i]){
	ans = -1;
	return -1;
  }
  vis[idx(x,y)][d][i] = true;
  
  if(cmd[i] == '['){
	i = ifs(i+1,st);
	++i;
	return i;
  }
  else if(cmd[i] == '{'){
	i = whiles(i+1,st);
	++i;
	return i;
  }
  else{
	if(cmd[i] == '^'){
	  x += dx[d];
	  y += dy[d];
	  if(dat[y][x] == '#'){
		x -= dx[d];
		y -= dy[d];
	  }
	}
	else if(cmd[i] == 'v'){
	  x -= dx[d];
	  y -= dy[d];
	  if(dat[y][x] == '#'){
		x += dx[d];
		y += dy[d];
	  }
	}
	else if(cmd[i] == '>')
	  (d+=1) %= 4;
	else if(cmd[i] == '<')
	  (d+=3) %= 4;
	else
	  return i;
	st = make_tuple(x,y,d);
	++ans;
	++i;
	if(x==gx&&y==gy){
	  cout<<ans<<endl;
	  exit(0);
	}
	return (x==gx&&y==gy? -1:i);
  }
}
int cond(int i, TI& st, bool& res){
  int neg = 0;
  if(cmd[i] == '~'){
	neg = 1;
	++i;
  }
  if(cmd[i] == 'N')
	res = neg^(get<2>(st) == 0);
  else if(cmd[i] == 'E')
	res = neg^(get<2>(st) == 1);
  else if(cmd[i] == 'S')
	res = neg^(get<2>(st) == 2);
  else if(cmd[i] == 'W')
	res = neg^(get<2>(st) == 3);
  else if(cmd[i] == 'C'){
	int x, y, d;
	tie(x,y,d) = st;
	res = neg^(dat[y+dy[d]][x+dx[d]] == '#');
  }
  else if(cmd[i] == 'T')
	res = neg^1;
  ++i;
  return i;
}

int skip(int i, char oc, char cc){
  int cnt = 0;
  for(;;++i){
	if(cmd[i] == cc){
	  if(--cnt < 0)
		return i;
	}
	else if(cmd[i] == oc)
	  ++cnt;
  }
}
int ifs(int i, TI& st){
  bool flag;
  i = cond(i, st, flag);
  if(flag)
	return prog(i,st);
  return skip(i, '[', ']');
}
int whiles(int i, TI& st){
  int beg = i;
  while(true){
	bool flag;
	i = cond(i, st, flag);
	if(!flag) break;
	i = prog(i,st);
	if(i < 0) return -1;
	i = beg;
  }
  return skip(i, '{', '}');
}

int main(){
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  cin >> H >> W;
  REP(i,H){
	cin >> dat[i];
	REP(x,W)
	  if(dat[i][x] == 's') sx = x, sy = i;
	  else if(dat[i][x] == 'g') gx = x, gy = i;
  }
  cin >> cmd;
  N = SZ(cmd);

  TI tmp(sx,sy,0);
  prog(0,tmp);

  cout << -1 << endl;

  /*
  REP(y,H){
	REP(x,W){
	  bool ok = false;
	  REP(i,N) REP(d,4)
		if(vis[idx(x,y)][d][i]) ok = true;
	  cout << (ok?"*":"?");
	}
	cout << endl;
  }
  */
  return 0;
}

Measured memory_bytes: 12392