/*第一次写搜索,迷宫类型题,搜索题大部分是递归的嵌套,这题是典型的位置移动题,可以单独开一个数组来存位置移动的坐标,int dir[][],分别为上下左右,是根据不撞南墙不回头,一撞南墙就回头,通过搜索找到这个目标是否可以,当全部走过就可以确定是否能找到这个目标点*/
#include<stdio.h>
#include<string.h>
int n, m;
int sx, sy, ex, ey;
int flag;
int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };//方位定位;
int vis[520][520]; //标记的路是否做过,走过的路不在走;
char str[520][520];
void dfs(int px, int py) {
    vis[px][py] = 1;
    if ( px == ex && py == ey) flag = 1;
    for (int i = 1; i <= 4; i++) {
            int xx = px + dir[i][0];  //计算新的坐标;
            int yy = py + dir[0][i];
            if (str[xx][yy] != '#' && !vis[xx][yy] && xx < n && xx >= 0 && yy < m && yy >= 0) {
                dfs(xx, yy);  //判断这个点是不是ex,ey;
            }
    }
}
int main() {
    while (~scanf("%d%d", &n, &m)) {
        memset(vis, 0, sizeof(vis));
        flag = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf(" %c", &str[i][j]);
                if (str[i][j] == 'S') {
                     sx = i;
                     sy = j;
                }
                if (str[i][j] == 'E') {
                     ex = i;
                     ey = j;
                }
            }
        }
        dfs(sx, sy);
        if (flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}