#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)





#define CMAX 4
#define OFFSET 0
struct Node { int nxt[CMAX + 1]; int exist; vector<int> accept;
Node() : exist(0){ memset(nxt, -1, sizeof(nxt)); }};
struct Trie {
	vector<Node> nodes; int root;
	Trie() : root(0){ nodes.push_back(Node()); }
	void update_direct(int node, int id) { nodes[node].accept.push_back(id); }
	void update_child(int node, int child, int id) { ++nodes[node].exist; }
	void add(const string &str, int str_index, int node_index, int id)
	{
		if (str_index == str.size()) update_direct(node_index, id);
		else {
			const int c = str[str_index] - OFFSET;
			if (nodes[node_index].nxt[c] == -1) {
				nodes[node_index].nxt[c] = (int)nodes.size();
				nodes.push_back(Node());
			}
			add(str, str_index + 1, nodes[node_index].nxt[c], id);
			update_child(node_index, nodes[node_index].nxt[c], id);
		}
	}
	void add(const string &str, int id) { add(str, 0, 0, id); }
	void add(const string &str) { add(str, nodes[0].exist); }
	int size() { return (nodes[0].exist); }
	int nodesize() { return ((int)nodes.size()); }
};

struct AhoCorasick : Trie {
	static const int FAIL = CMAX; vector<int> correct;
	AhoCorasick() : Trie() {}
	void build() {
		correct.resize(nodes.size());
		rep(i, 0, nodes.size()) correct[i] = (int)nodes[i].accept.size();

		queue<int> que;
		rep(i, 0, CMAX + 1) {
			if (~nodes[0].nxt[i]) {
				nodes[nodes[0].nxt[i]].nxt[FAIL] = 0;
				que.emplace(nodes[0].nxt[i]);
			} else nodes[0].nxt[i] = 0;
		}
		while (!que.empty()) {
			Node &now = nodes[que.front()];
			correct[que.front()] += correct[now.nxt[FAIL]];
			que.pop();
			for (int i = 0; i < CMAX; i++) {
				if (now.nxt[i] == -1) continue;
				int fail = now.nxt[FAIL];
				while (nodes[fail].nxt[i] == -1) {
					fail = nodes[fail].nxt[FAIL];
				}
				nodes[now.nxt[i]].nxt[FAIL] = nodes[fail].nxt[i];

				auto &u = nodes[now.nxt[i]].accept;
				auto &v = nodes[nodes[fail].nxt[i]].accept;
				vector<int> accept;
				set_union(begin(u), end(u), begin(v), end(v), back_inserter(accept));
				u = accept;
				que.emplace(now.nxt[i]);
			}
		}
	}

	int match(const string &str, vector< int > &result, int now = 0) {
		result.assign(size(), 0);
		int count = 0;
		for (auto &c : str) {
			while (nodes[now].nxt[c - OFFSET] == -1) now = nodes[now].nxt[FAIL];
			now = nodes[now].nxt[c - OFFSET];
			count += correct[now];
			for (auto &v : nodes[now].accept) ++result[v];
		}
		return count;
	}

	int next(int now, char c) {
		while(nodes[now].nxt[c - OFFSET] == -1) now = nodes[now].nxt[FAIL];
		return nodes[now].nxt[c - OFFSET];
	}
};
//-----------------------------------------------------------------
int H, W, P;
string MAP[50], BAN[10];
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { -1, 0, 1, 0 };
string dir = "URDL";
#define INF INT_MAX/2
void change(string &s) {
	rep(i, 0, s.length()) rep(j, 0, 4) if (s[i] == dir[j]) s[i] = j;
}
bool done[50][50][100];
int dist[50][50][100];
int sol() {
	AhoCorasick ac;
	rep(i, 0, P) {
		change(BAN[i]);
		ac.add(BAN[i]);
	}
	ac.build();

	// LD -> 32
	// DD -> 22
	// LLL -> 333
	for (int i : ac.nodes[0].accept) {
		cout << i << endl;
	}


	rep(i, 0, 50) rep(j, 0, 50) rep(k, 0, 100) done[i][j][k] = false;
	rep(i, 0, 50) rep(j, 0, 50) rep(k, 0, 100) dist[i][j][k] = INF;

	queue<int> q;
	int N = ac.nodesize();
	
	rep(y, 0, H) rep(x, 0, W) if (MAP[y][x] == 'S') {
		q.push(y * 100 * 100 + x * 100 + 0);
		dist[y][x][0] = 0;
		done[y][x][0] = true;
	}

	while (!q.empty()) {
		int y = q.front() / 10000;
		int x = (q.front() % 10000) / 100;
		int s = q.front() % 100;
		q.pop();

		if (MAP[y][x] == 'G') return dist[y][x][s];

		rep(i, 0, 4) {
			int xx = x + dx[i];
			int yy = y + dy[i];
			if (xx < 0 || W <= xx) continue;
			if (yy < 0 || H <= yy) continue;
			if (MAP[yy][xx] == '#') continue;
			int ss = ac.next(s, i);

			// ??°????????¢??¶??????????????\
			if (ac.correct[ss]) continue;

			if (done[yy][xx][ss]) continue;

			q.push(yy * 10000 + xx * 100 + ss);
			dist[yy][xx][ss] = dist[y][x][s] + 1;
			done[yy][xx][ss] = true;
		}
	}

	return -1;
}
//-----------------------------------------------------------------
int main() {
	while (cin >> H >> W) {
		if (H == 0) return 0;
		rep(y, 0, H) cin >> MAP[y];
		cin >> P;
		rep(i, 0, P) cin >> BAN[i];

		cout << sol() << endl;
	}
}

Measured memory_bytes: 4248