import sys
from collections import deque
def judge(rset,cset,visits):
# 判断从行集合和列集合打激光能不能碰到visits的点
# 先判断行集合
for rs in rset:
if 1 in visits[rs]:
return 1
elif rs-1>=0 and 1 in visits[rs-1]:
return 1
elif rs+1<r and 1 in visits[rs+1]:
return 1
# 再判断列集合
for cs in cset:
if 1 in [row[cs] for row in visits] :
return 1
elif cs-1>=0 and 1 in [row[cs-1] for row in visits]:
return 1
elif cs+1<c and 1 in [row[cs+1] for row in visits]:
return 1
return 0
pass
r, c = map(int,input().split())
data = []
for _ in range(r):
data.append(list(input()))
dirs = [(1,0),(0,1),(-1,0),(0,-1)]
start = []
end = []
for i in range(r):
for j in range(c):
if data[i][j] == 'S':
start = [i,j]
elif data[i][j] == 'E':
end = [i,j]
q = deque()
visits = [[0]*c for _ in range(r)]
q.append(start)
visits[start[0]][start[1]] = 1
while q:
x, y = q.popleft()
for dx,dy in dirs:
nx, ny = x+dx, y +dy
if nx == end[0] and ny == end[1]:
print('YES')
exit()
if 0<=nx<r and 0<=ny<c and data[nx][ny]=='.':
q.append([nx,ny])
visits[nx][ny] = 1
data[nx][ny] = '#'
q = deque()
# visite = [[0]*c for _ in range(r)]
q.append(end)
rset = set()
cset = set()
rset.add(end[0])
cset.add(end[1])
while q:
x, y = q.popleft()
for dx,dy in dirs:
nx, ny = x+dx, y +dy
if 0<=nx<r and 0<=ny<c and data[nx][ny]=='.':
q.append([nx,ny])
rset.add(nx)
cset.add(ny)
data[nx][ny] = '#'
# print(rset,cset)
# print(visits)
res= judge(rset,cset,visits)
if res:
print('YES')
else:
print('NO')