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

struct Ahocora{

  int idx;

  struct PMA {
      int state;
      PMA* next[256];
      vector<int> matched;
      PMA(int idx) { memset(next, 0, sizeof(next)); state = idx ; }
      ~PMA() { for(int i = 0; i < 256; i++) if(next[i]) delete next[i]; }
  };
  vector<int> set_uni(const vector<int> &a,const vector<int> &b) {
      vector<int> res;
      set_union(a.begin(),a.end(),b.begin(),b.end(), back_inserter(res));
      return res;
  };

  PMA *root;

  map<int,PMA*>M;

  Ahocora(vector<string> &pattern) { idx=0;
      root = new PMA(idx++);
      M[idx-1]=root;
      PMA *now;
      root->next[0] = root;
      for(int i = 0; i < pattern.size(); i++) {
          now = root;
          for(int j = 0; j < pattern[i].size(); j++) {
              if(now->next[(int)pattern[i][j]] == 0){
                  now->next[(int)pattern[i][j]] = new PMA(idx++);
                  M[idx-1] = now->next[(int)pattern[i][j]];
                }
              now = now->next[(int)pattern[i][j]];
          }
          now->matched.push_back(i);
      }

      queue<PMA*> que;

      for(int i=1;i<256;i++){
          if(!root->next[i]) root->next[i] = root;
          else{
              root->next[i]->next[0] = root;
              que.push(root->next[i]);
          }
      }

      while(!que.empty()) {
          now = que.front(); que.pop();//cout<<1;
          for(int i = 1; i < 256; i++) {
              if(now->next[i]){
                  PMA *nxt = now->next[0];
                  while(!nxt->next[i]) nxt = nxt->next[0];
                  now->next[i]->next[0] = nxt->next[i];
                  now->next[i]->matched = set_uni(now->next[i]->matched, nxt->next[i]->matched);
                  que.push(now->next[i]);
              }
          }
      }

  }
  void match( const string s, vector<int> &res) {
    PMA *pma=root;
      for(int i = 0; i < s.size(); i++){
          int c = s[i];
          while(!pma->next[c])
              pma = pma->next[0];
          pma = pma->next[c];
          for(int j = 0; j < pma->matched.size(); j++)
              res[pma->matched[j]] = true;
      }
  }
  int NG( const string s,int S) {
    PMA *pm = M[S];
    //cout<<pm->state<<endl;
      for(int i = 0; i < s.size(); i++){
          int c = s[i];
          while(!pm->next[c])
              pm = pm->next[0];
          pm = pm->next[c];
          for(int j = 0; j < pm->matched.size(); j++) return -1;
      }
    //cout<<pm->state<<endl;
    return pm->state;
  }
};

#define r(i,n) for(int i=0;i<n;i++)

int h,w,m,x,y;
int dp[55][55][222];
string s[100];
string a;
vector<string>v;

int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
string dc[]={"U","R","D","L"};

struct A{
  int x,y,s;
  A(int a,int b,int c){x=a,y=b,s=c;}
};

int main(){
  while(1){
    v.clear();
    memset(dp,-1,sizeof(dp));
    cin>>h>>w;
    if(!h)break;
    r(i,h)cin>>s[i];
    r(i,h)r(j,w)if(s[i][j]=='S')x=j,y=i;
    cin>>m;
    r(i,m){
      cin>>a;
      v.push_back(a);
    }
    Ahocora AHO(v);
    queue<A>q;
    q.push(A(x,y,0));
    dp[y][x][0]=0;
    while(!q.empty()){
      A p=q.front();q.pop();
      x=p.x;
      y=p.y;
      int S=p.s;
      r(i,4){
        int nx=x+dx[i];
        int ny=y+dy[i];
        int ns=AHO.NG(dc[i],S);

        if(ns==-1)continue;

        if(ny<0||nx<0||ny>=h||nx>=w)continue;
        if(s[ny][nx]=='#')continue;
        if(dp[ny][nx][ns]!=-1)continue;

        if(s[ny][nx]=='G'){
          cout<<dp[y][x][S]+1<<endl;
          goto L;
        }
        dp[ny][nx][ns]=dp[y][x][S]+1;

        q.push(A(nx,ny,ns));
      }
    }
    cout<<-1<<endl;
    L:;
  }
}



Measured memory_bytes: 9248