from collections import deque

# Process input
m, n = map(int, input().split())
mat = [None] * m
start = None
end = None
for i in range(m):
    mat[i] = row = [None] * n
    sRow = input()
    for j in range(n):
        ch = sRow[j]
        if ch == '#':
            row[j] = 1
        elif ch == '.':
            row[j] = 0
        elif ch == 'S':
            row[j] = 0
            start = (i, j)
        elif ch == 'E':
            row[j] = 0
            end = (i, j)

# Algo
def update_range(rg, x, y):
    rg[0] = min(rg[0], x)
    rg[1] = max(rg[1], x)
    rg[2] = min(rg[2], y)
    rg[3] = max(rg[3], y)

def is_connected(min1, max1, min2, max2):
    return (min1 <= min2 <= max1 
        or min1 <= max2 <= max1
        or min2 <= min1 <= max2
        or min2 <= max1 <= max2
        or min2-max1 == 1
        or min1-max2 == 1)

def is_rect_connected(rgA, rgB):
    return is_connected(rgA[0], rgA[1], rgB[0], rgB[1]) or \
        is_connected(rgA[2], rgA[3], rgB[2], rgB[3])
# - BFS
def bfs(startP, rg):
    q = deque()
    visited = [[False]*n for _ in range(m)]
    q.append(startP)
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    while q:
        u, v = q.popleft()
        if u < 0 or u >= m or v < 0 or v >= n:
            continue
        if visited[u][v]:
            continue
        visited[u][v] = True
        if mat[u][v]:
            continue
        update_range(rg, u, v)
        for i in range(4):
            q.append((u+dx[i], v+dy[i]))
rgS = [start[0], start[0], start[1], start[1]]
rgE = [end[0], end[0], end[1], end[1]]
res = False
if is_rect_connected(rgS, rgE):
    res = True
if not res:
    bfs(start, rgS)
    res |= is_rect_connected(rgS, rgE)
if not res:
    bfs(end, rgE)
    res |= is_rect_connected(rgS, rgE)
print("YES" if res else "NO")