#include <iostream>
#include <vector>
#include <memory.h>
#include <algorithm>
#include <queue>
using namespace std;

const int INF = 1 << 25;
int direction[1000010][4];
int memo[1010][1010][4];
vector<int> direct[4];
char field[1010][1010];
string command;

int dy[] = {-1, 0, 1, 0};
int dx[] = {0, 1,  0, -1};

typedef pair<int, int> P;
typedef pair<P, int> state;  // position, direcion
typedef pair<int, state> data;


int main(){
  int H, W, N;
  int sy, sx;
  int gy, gx;
  while(cin >> H >> W >> N && (H || W || N)){
    int dir = 0;
    cin >> command;
    
    
    for(int i = 0; i < 1000010; i++){
      for(int j = 0; j < 4; j++){
	direction[i][j] = INF;
      }
    }
    for(int i = 0; i < 1010; i++){
      for(int j = 0; j < 1010; j++){
	field[i][j] = '#';
	for(int k = 0; k < 4; k++){
	  memo[i][j][k] = INF;
	}
      }
    }

    for(int i = 0; i < H; i++){
      for(int j = 0; j < W; j++){
	cin >> field[i+1][j+1];
	if(field[i+1][j+1] == 'S'){
	  sy = i + 1;
	  sx = j + 1;
	  field[i+1][j+1] = '.';
	}
	if(field[i+1][j+1] == 'G'){
	  gy = i + 1;
	  gx = j + 1;
	  field[i+1][j+1] = '.';
	}
      }
    }
    
    for(int i = 0; i < 4; i++) direct[i].clear();
    for(int i = 0; i < N; i++){
      direct[dir].push_back(i);
      if(command[i] == 'R') dir = (dir + 1) %4 ;
      else dir = (dir + 3) % 4;
    }
    direct[dir].push_back(N);
    
    for(int i = 0; i <= N; i++){
      for(int j = 0; j < 4; j++){
	vector<int>::iterator iter
	  = upper_bound(direct[j].begin(), direct[j].end(), i);
	if(iter != direct[j].end()) direction[i][j] = *iter;
      }
    }
    
    memo[sy][sx][0] = 0;
    priority_queue<data, vector<data>, greater<data> > que;
 
    bool flag=false;
    que.push(data(0, state(P(sy, sx), 0)));
    while(!que.empty()){
      data d = que.top();
      int cost = d.first;
      state s = d.second;
      int y = s.first.first;
      int x = s.first.second;
      int dir = s.second;
      que.pop();
      
      if(s.first.first == gy && s.first.second==gx){
	flag = true;
	break;
      }
      if(cost > memo[y][x][dir]) continue;

      
      
      for(int i=0;i<4;i++){
	int nextturn = direction[cost][i];
	int y2 = y + dy[i];
	int x2 = x + dx[i];
	if(field[y2][x2] == '#') continue;
	if(memo[y2][x2][i] > nextturn){
	  memo[y2][x2][i] = nextturn;
	  que.push(data(nextturn, state(P(y2, x2), i)));
	}
	
      }
      int y2 = y + dy[dir];
      int x2 = x + dx[dir];
      if(field[y2][x2] != '#' && memo[y2][x2][dir] > cost){
	memo[y2][x2][dir] = cost;
	que.push(data(cost, state(P(y2, x2), dir)));
      }
    }
    if(flag){
      cout << "Yes" << endl;
    }else{
      cout << "No" << endl;
    }
  }
  return 0;
}