#include<iostream>
#include<cstring>
#include<queue>
#include<stdlib.h>
using namespace std;
char map[25][25];
char vis[25][25];
int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int m,n;
int sx,sy;
int gx,gy;
struct node{
int x;
int y;
int v;
int v1;
int g;
int z;
}door[8];
struct wz{
int x;
int y;
};
void bfs(){
queue<wz>q;
memset(vis,0,sizeof(vis));
wz a;
a.x=sx;
a.y=sy;
q.push(a);
while(!q.empty()){
a=q.front();
q.pop();
wz b;
for(int i=0;i<4;i++){
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(b.x>=0&&b.y>=0&&b.x<m&&b.y<n&&!vis[b.x][b.y]&&map[b.x][b.y]!='X'){
if(map[b.x][b.y]>='a'&&map[b.x][b.y]<='e'){
vis[b.x][b.y]=1;
q.push(b);
door[map[b.x][b.y]-'a'].g++;
if(door[map[b.x][b.y]-'a'].g==door[map[b.x][b.y]-'a'].z){
door[map[b.x][b.y]-'a'].v=1;
if(door[map[b.x][b.y]-'a'].v1==1){
b.x=door[map[b.x][b.y]-'a'].x;
b.y=door[map[b.x][b.y]-'a'].y;
vis[b.x][b.y]=1;
q.push(b);
}
}
}
if(map[b.x][b.y]>='A'&&map[b.x][b.y]<='E'){
door[map[b.x][b.y]-'a'].v1=1;
if(door[map[b.x][b.y]-'a'].v==1){
vis[b.x][b.y]=1;
q.push(b);
}
}
if(map[b.x][b.y]=='.'){
vis[b.x][b.y]=1;
q.push(b);
}
if(map[b.x][b.y]=='G'){
cout<<"Yes"<<endl;
return ;
}
}
}
}
cout<<"No"<<endl;
}
int main(){
while(cin>>m>>n){
if(m==0&&n==0){
break;
}
for(int i=0;i<8;i++){
door[i].v=0;
door[i].v1=0;
door[i].g=0;
door[i].z=0;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>map[i][j];
if(map[i][j]=='S'){
sx=i;
sy=j;
}
if(map[i][j]=='G'){
gx=i;
gy=j;
}
if(map[i][j]>='a'&&map[i][j]<='e'){
door[map[i][j]-'a'].z++;
}
if(map[i][j]>='A'&&map[i][j]<='E'){
door[map[i][j]-'a'].x=i;
door[map[i][j]-'a'].y=j;
}
}
}
bfs();
}
return 0;
}