#include<bits/stdc++.h>
using namespace std;
#define MAX_N 1000005
#define MAX_H 1005
#define MAX_W 1005

int dy[]={-1,0,1,0};
int dx[]={0,1,0,-1};
int INF = 1e8;
struct state{
  int y,x,cost;
  bool operator < (const state &p)const{
    return cost > p.cost;
  }
};

int H,W,N;
int si,sj,ti,tj;
char a[MAX_N];
int b[4][MAX_N];

char t[MAX_H][MAX_W];
int d[MAX_H][MAX_W];


bool solve(){
  fill( (int*)d[0], (int*)d[MAX_H] , INF );
  priority_queue< state > Q;
  Q.push( (state){si,sj,0} );
  d[si][sj]=0;
  while(!Q.empty()){
    state s=Q.top();Q.pop();
    if(s.cost > d[s.y][s.x])continue;
    if(t[s.y][s.x]=='G')return true;
    for(int ndir=0;ndir<4;ndir++){
      int ncost=b[ndir][s.cost];
      if(ncost==-1)continue;
      int ny=s.y+dy[ndir];
      int nx=s.x+dx[ndir];
      if(ny<0 || nx<0 || ny>=H || nx>=W )continue;
      if(t[ny][nx]=='#')continue;
      if(ncost < d[ny][nx]){
        d[ny][nx]=ncost; 
        Q.push( (state){ny,nx,ncost} );
      }
    }
  }
  return false;
}

int main(){
  while(1){
    scanf("%d %d %d",&H,&W,&N);
    if(H==0&&W==0&&N==0)break;
    
    scanf("%s",a);

    memset(b,-1,sizeof(b));
    int dir=0;
    for(int i=0;i<=N;i++){
      b[dir][i]=i;
      if(i<N)dir=dir+(a[i]=='L'?3:1);
      if(dir>=4)dir-=4;
    }
    for(int i=N-1;i>=0;i--){
      for(int j=0;j<4;j++){
        if(b[j][i]==-1)b[j][i]=b[j][i+1];
      }
    }
    
    for(int i=0;i<H;i++){
      scanf("%s",t[i]);
      for(int j=0;j<W;j++){
        if(t[i][j]=='S')si=i,sj=j;
      }
    }
    printf(solve() ? "Yes\n" : "No\n" );
  }
  return 0;
}