/**解题思路:本来看了这个题是一筹莫展的,仔细考虑一下还是可以写的,首先要读懂题目
1.宝藏在地图里可能被门锁,也可能不被门锁。
2.要想开门必须找到地图中所有的钥匙才能开门。
下面就是解题了,首要任务就是要找到所有的钥匙,
在找钥匙的途中如果遇到能开的门就给开了,如果能遇到宝藏就直接返回true,
如果不能的话就判断有没有锁和钥匙能不能全部找到,如果有钥匙且能够全部找到的话就再次广搜,
把能开的门都给开了,看途中能否遇到宝藏,如果遇到就返回true 以此类推将5个门都找一遍,如果还没找到宝藏就输出N0
*/
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int x,y;
};
int m,n,A,B,C,D,E,sx,sy,ex,ey;
char Map[25][25];
int vis[25][25],dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int bfs()
{memset(vis,0,sizeof(vis));
queue<Node> Q;
Node cur,next;
cur.x=sx;cur.y=sy;
vis[cur.x][cur.y]=1;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>=0&&next.x<m&&next.y>=0&&next.y<n&&vis[next.x][next.y]==0&&Map[next.x][next.y]!='X')
{
if(Map[next.x][next.y]=='.') vis[next.x][next.y]=1,Q.push(next);
else if(Map[next.x][next.y]=='G') return 1;//搜索途中找到宝藏就直接返回
else if(Map[next.x][next.y]=='a'){//如果遇到相应的钥匙,钥匙数目-1,将钥匙变为路
A--;
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);
}
else if(Map[next.x][next.y]=='b'){
B--;
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);
}
else if(Map[next.x][next.y]=='c'){
C--;
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);
}
else if(Map[next.x][next.y]=='d'){
D--;
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);
}
else if(Map[next.x][next.y]=='e'){
E--;
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);
}
else if(Map[next.x][next.y]=='A'){//遇到门时判断是不是所有的钥匙都找到了,如果全部找到将门变成路,入队,否则不做任何处理
if(A==0){
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);}
}
else if(Map[next.x][next.y]=='B'){
if(B==0){
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);}
}
else if(Map[next.x][next.y]=='C'){
if(C==0){
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);}
}
else if(Map[next.x][next.y]=='D'){
if(D==0){
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);}
}
else if(Map[next.x][next.y]=='E'){
if(E==0){
Map[next.x][next.y]='.';
vis[next.x][next.y]=1;
Q.push(next);}
}
}
}
}
return 0;
}
int used[10];///用来判断是不是有这个钥匙
int main()
{
while(cin>>m>>n,m+n)
{
A=B=C=D=E=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,Map[i][j]='.';
else if(Map[i][j]=='G')
ex=i,ey=j;
else if(Map[i][j]=='a')A++;
else if(Map[i][j]=='b')B++;
else if(Map[i][j]=='c')C++;
else if(Map[i][j]=='d')D++;
else if(Map[i][j]=='e')E++;
}
int ans;
memset(used,0,sizeof(used));
if(A==0)used[1]=1;
if(B==0)used[2]=1;
if(C==0)used[3]=1;
if(D==0)used[4]=1;
if(E==0)used[5]=1;
ans = bfs();
if(ans==1)
cout<<"YES"<<endl;
else
{
while(1)
{
if(A==0&&used[1]==0)//A门有钥匙且钥匙全部找到就再次搜索把A门给开了
{
ans=bfs();used[1]=1;
if(ans)
break;
}
else if(B==0&&used[2]==0)
{
ans=bfs();used[2]=1;
if(ans)
break;
}
else if(C==0&&used[3]==0)
{
ans=bfs();used[3]=1;
if(ans)
break;
}
else if(D==0&&used[4]==0)
{
ans=bfs();used[4]=1;
if(ans)
break;
}
else if(E==0&&used[5]==0)
{
ans=bfs(); used[5]=1;
if(ans)
break;
}
else break;
}
if(ans)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}