BFS
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int stepx[]={1,-1,0,0};
int stepy[]={0,0,1,-1};
char map[25][25];
bool vis[25][25];
int reSearch,ok;
int key[10],fkey[10];
struct Point{
int x,y;
}start,end;
void reSet(int cur)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j]==(cur+'a'-1) || map[i][j]==(cur+'A'-1) )
map[i][j]='.';
}
void dfs(int x,int y)
{
int i,num,xx,yy;
if(ok || reSearch) return;
if(map[x][y]=='G') {ok=1;return;}
vis[x][y]=1;
if(map[x][y]=='X') return;
if(map[x][y]>='A' && map[x][y]<='E') return;
if(map[x][y]>='a' && map[x][y]<='e')
{
num=map[x][y]-'a'+1;
fkey[num]++;
if(fkey[num]==key[num]) {
reSet(num); //重置矩形,把该门和钥匙变'.';
// printf("change %d\n",num);
reSearch=1; return;
}
}
for(i=0;i<4;i++)
{
xx=x+stepx[i];
yy=y+stepy[i];
if(xx>=1 && xx<=n && yy>=1 && yy<=m && !vis[xx][yy])
{
vis[xx][yy]=1;
dfs(xx,yy);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
char s[55];
int i,j;
while(~scanf("%d%d",&n,&m))
{
if(n==0 && m==0) break;
memset(key,0,sizeof(key));
memset(fkey,0,sizeof(fkey));
for(i=1;i<=n;i++)
{
scanf("%s",s);
for(j=1;j<=m;j++)
{
map[i][j]=s[j-1];
if(s[j-1]=='S') start.x=i,start.y=j;
else if(s[j-1]>='a' && s[j-1]<='e')
key[s[j-1]-'a'+1]++;
}
}
for(i=1;i<=5;i++)
if(key[i]==0) reSet(i); //WA 一次: 如果A门没有钥匙,那么A门也重置
// for(i=1;i<=5;i++)
// printf("*%d\n",key[i]);
ok=0;
reSearch=1;
while(reSearch)
{
reSearch=0;
memset(vis,0,sizeof(vis));
memset(fkey,0,sizeof(fkey));
vis[start.x][start.y]=1;
dfs(start.x,start.y);
}
if(ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}