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

#define rep(i, n) for(int i = 0; i < (n); i++)
#define repp(i, l, r) for(int i = (l); i < (r); i++)
#define per(i, n) for(int i = ((n)-1); i >= 0; i--)
#define perr(i, l, r) for(int i = ((r)-1); i >= (l); i--)
#define all(x) (x).begin(),(x).end()
#define MOD 1000000007
#define IINF 1000000000
#define LINF 1000000000000000000
#define SP <<" "<<
#define CYES cout<<"Yes"<<endl;
#define CNO cout<<"No"<<endl;

typedef long long LL;
typedef long double LD;

struct whs{
  int back;
  string c;
  set<tuple<int,int,int>> se;
};

int main(){
  int h,w;
  cin >> h >> w;
  int sx,sy,gx,gy;
  vector<string> f(h);
  rep(i,h){
    cin >> f[i];
    rep(j,w){
      if(f[i][j]=='s'){
        sy=i;
        sx=j;
      }else if(f[i][j]=='g'){
        gy=i;
        gx=j;
      }
    }
  }
  string s;
  cin >> s;
  int n=s.size();
  int idx=0;
  stack<whs> st;
  vector<int> vx = {0,1,0,-1};
  vector<int> vy = {-1,0,1,0};
  int x=sx,y=sy,d=0;
  int count=0;
  for(;idx<n;idx++){
    if(s[idx]=='{'){
      int pidx=idx;
      bool flag=false;
      idx++;
      if(s[idx]=='~'){
        flag=true;
        idx++;
      }
      if(s[idx]=='N'){
        if(d==0) flag^=true;
      }else if(s[idx]=='E'){
        if(d==1) flag^=true;
      }else if(s[idx]=='S'){
        if(d==2) flag^=true;
      }else if(s[idx]=='W'){
        if(d==3) flag^=true;
      }else if(s[idx]=='C'){
        if(f[y+vy[d]][x+vx[d]]=='#') flag^=true;
      }else if(s[idx]=='T'){
        flag^=true;
      }
      if(!flag){
        int c=1;
        while(c){
          idx++;
          if(s[idx]=='{'||s[idx]=='[') c++;
          if(s[idx]=='}'||s[idx]==']') c--;
        }
      }else{
        st.push({idx,s.substr(pidx+1,idx-pidx),set<tuple<int,int,int>>()});
      }
    }else if(s[idx]=='}'){
      int pidx=0;
      bool flag=false;
      string c = st.top().c;
      if(c[pidx]=='~'){
        flag=true;
        pidx++;
      }
      if(c[pidx]=='N'){
        if(d==0) flag^=true;
      }else if(c[pidx]=='E'){
        if(d==1) flag^=true;
      }else if(c[pidx]=='S'){
        if(d==2) flag^=true;
      }else if(c[pidx]=='W'){
        if(d==3) flag^=true;
      }else if(c[pidx]=='C'){
        if(f[y+vy[d]][x+vx[d]]=='#') flag^=true;
      }else if(c[pidx]=='T'){
        flag^=true;
      }
      if(!flag){
        st.pop();
      }else{
        tuple<int,int,int> t=make_tuple(x,y,d);
        if(st.top().se.find(t)!=st.top().se.end()){
          cout << -1 << endl;
          return 0;
        }
        st.top().se.insert(t);
        idx=st.top().back;
      }
    }else if(s[idx]=='['){
      bool flag=false;
      idx++;
      if(s[idx]=='~'){
        flag=true;
        idx++;
      }
      if(s[idx]=='N'){
        if(d==0) flag^=true;
      }else if(s[idx]=='E'){
        if(d==1) flag^=true;
      }else if(s[idx]=='S'){
        if(d==2) flag^=true;
      }else if(s[idx]=='W'){
        if(d==3) flag^=true;
      }else if(s[idx]=='C'){
        if(f[y+vy[d]][x+vx[d]]=='#') flag^=true;
      }else if(s[idx]=='T'){
        flag^=true;
      }
      if(!flag){
        int c=1;
        while(c){
          idx++;
          if(s[idx]=='{'||s[idx]=='[') c++;
          if(s[idx]=='}'||s[idx]==']') c--;
        }
      }
    }else if(s[idx]==']'){
    }else{
      count++;
      if(s[idx]=='^'){
        if(f[y+vy[d]][x+vx[d]]!='#'){
          x+=vx[d];
          y+=vy[d];
        }
      }else if(s[idx]=='v'){
        if(f[y-vy[d]][x-vx[d]]!='#'){
          x-=vx[d];
          y-=vy[d];
        }
      }else if(s[idx]=='<'){
        d=(d+3)%4;
      }else{
        d=(d+1)%4;
      }
    }
    if(x==gx&&y==gy){
      cout << count << endl;
      return 0;
    }
  }
  cout << -1 << endl;
  return 0;
}



Measured memory_bytes: 3244