from collections import deque

def bfs(start_x:int, start_y:int, maze:list, n:int, m:int):
    dist = [[-1]*m for _ in range(n)]
    dist[start_x][start_y] = 0
    q = deque()
    q.append((start_x, start_y))
    while q:
        x, y = q.popleft()
        for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
            nx, ny = x+dx, y+dy
            if 0<=nx<n and 0<=ny<m and maze[nx][ny] != '#' and dist[nx][ny] == -1:
                dist[nx][ny] = dist[x][y] + 1
                q.append((nx, ny))
    return dist


def can_connect_by_laser(n: int, m: int, maze: list, dist_S: list, dist_E: list) -> bool:
    # 收集S可达点的所有行和列编号
    X = set()
    Y = set()
    for i in range(n):
        for j in range(m):
            if dist_S[i][j] >= 0:
                X.add(i)
                Y.add(j)
    # 遍历所有E可达点,看其周围行/列是否与S的集合有交集
    for i in range(n):
        for j in range(m):
            if dist_E[i][j] >= 0:
                for dx in [-1, 0, 1]:
                    if 0 <= i + dx < n and (i + dx) in X:
                        return True
                for dy in [-1, 0, 1]:
                    if 0 <= j + dy < m and (j + dy) in Y:
                        return True
    return False

                
def main():
    n, m = map(int, input().split())
    maze = [list(input().strip()) for _ in range(n)]
    Sx = Sy = Ex = Ey = -1
    for i in range(n):
        for j in range(m):
            if maze[i][j] == 'S':
                Sx, Sy = i, j
                maze[i][j] = '.'
            elif maze[i][j] == 'E':
                Ex, Ey = i, j
                maze[i][j] = '.'

    dist_S = bfs(Sx, Sy, maze, n, m)
    dist_E = bfs(Ex, Ey, maze, n, m)
    # 如果起点终点本身连通,无需激光
    if dist_S[Ex][Ey] != -1:
        print("YES")
        return
    # 不连通的话,就要判断激光
    if can_connect_by_laser(n, m, maze, dist_S, dist_E):
        print("YES")
        return
    else:
        print("NO")
        return

if __name__ == "__main__":
    main()