# 高橋君！の問題について
# したのコードでTLEになってしまうのは、もうPythonの限界なのか、
# 無駄なプロセスがあるのかどうかを聞く。

H,W=map(int,input().split())
mp=[list(input()) for _ in range(H)]
for i in range(H):
    for j in range(W):
        if mp[i][j]=="s":
            start=(i,j)
        elif mp[i][j]=="g":
            goal=(i,j)
dxy=[(1,0),(0,1),(-1,0),(0,-1)]
import queue
from collections import defaultdict
q=queue.Queue()
d=defaultdict()
q.put(start)
while not q.empty():
    now=q.get()
    if not now in d.keys():
        d[now]=0
    for (dx,dy) in dxy:
        n_0=now[0]+dx
        n_1=now[1]+dy
        #すでに行っていたとしても、塀をより壊していない
        #ルートなら採用するべき
        if (n_0,n_1) in set(d.keys()):
            if mp[n_0][n_1]=="#":
                if d[(n_0,n_1)]>d[now]+1:
                    q.put( (n_0,n_1) )
                    d[(n_0,n_1)]=d[now]+1
            else:
                if d[(n_0,n_1)]>d[now]:
                    q.put( (n_0,n_1) )
                    d[(n_0,n_1)]=d[now]
        else:#初めてのルート
            if 0<=n_0<H and 0<=n_1<W:
                if mp[n_0][n_1]=="g":
                    print("YES")
                    exit(0)
                elif mp[n_0][n_1]=="#":
                    if d[now]<2:
                        q.put( (n_0,n_1) )
                        d[(n_0,n_1)]=d[now]+1
                else:
                    q.put( (n_0,n_1) )
                    d[(n_0,n_1)]=d[now]
print("NO")