#include <iostream>
#include <set>
#include <vector>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define ll long long
const int M = 1e3 + 1;
using namespace std;
int flag = 0;
char a[M][M];//存储图
int vis[M][M];//用来判断这个点是否跑过,如果跑过就不用遍历了
int n, m;
int x1[M] = { 0,0,-1,1,0 };//四个方向
int yt[M] = { 0,1,0,0,-1 };
bool check(int x,int y) {//check函数用来判断是否超出范围
    return x >= 1 && x <= n && y >= 1 && y <= m;
}
inline bool dfs(int x, int y) {
    if (a[x][y] == 'g') return 1;//如果找到直接返回1
    vis[x][y]=1;//置为1表示走过啦
    for (int i = 1; i <= 4; i++) {
        
            int dx, dy;
            dx = x1[i] + x;
            dy = y + yt[i];
            if (a[dx][dy] != '#' && dx >= 1 && dx <= n && dy >= 1 && dy <= m&&!vis[dx][dy]) {//首先不能是障碍物,其次这个点得没跑过
                if (dfs(dx, dy)) {//继续遍历,直到有1返回
                    return true;
                }
            }
        
        
    }
    return false;
}
int main()
{
    //int n, m;
    cin >> n >> m;
    getchar();
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
        getchar();
    }
    int x, y;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] == 's') {//表示找到了起点
                x = i, y = j;
                
            }
        }
    }
    
    
    if (dfs(x, y)) { cout << "Yes" << endl; }
    else cout << "No" << endl;


}