#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<map>
#include<set>
using namespace std;
#define MAX_N 0x0f0f0f0f
const int INF = 10000000;
typedef pair<int , int> P;
char maze[100][100]; //载入图
int M,N;// 行列
int sx,sy;//起始位置
int gx,gy;// 重点位置
int d[1000][1000];// 到起始位置的距离
int dx[]={1,0,-1,0};// 搜索方向
int dy[]={0,1,0,-1};
int bfs (){ // 搜索
queue <P> que;
for (int i=0;i<N;i++)
{
for (int j=0;j<M;j++)
d[i][j]=INF;
}
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size()){
P p=que.front ();
que.pop();
if(p.first==gx&&p.second==gy){
break;
}
for (int i=0;i<4;i++){
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(nx>=0&&ny<M&&ny>=0&&ny<N&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}
int main (){
cin>>M>>N;
for (int i=0;i<M;i++){
for (int j=0;j<M;j++)
{
cin>>maze[i][j];
if(maze[i][j]=='s'){
sx=i;
sy=j;
}else if(maze[i][j]=='g'){
gx=i;
gy=j;
}
}
}
int res=bfs();
cout<<res<<endl;
return 0;
}