#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template <typename T1, typename T2>
bool chmax(T1 &a, const T2 &b) {
  if(a < b) {a = b; return true;}
  return false;
}
template <typename T1, typename T2>
bool chmin(T1 &a, const T2 &b) {
  if(a > b) {a = b; return true;}
  return false;
}
template<typename T1, typename T2>
ostream& operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}
template<class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  for(int i=0;i<((int)(v.size()));++i) {
    if(i) os << " ";
    os << v[i];
  }
  return os;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  int w, h; cin >> w >> h;
  vector<vector<char>> v(h, vector<char>(w));
  vector<P> bane;
  P st, gl;
  for(int i=0;i<(h);++i) {
    for(int j=0;j<(w);++j) {
      cin >> v[i][j];
      if(v[i][j] == 's') {
        v[i][j] = '.';
        st = {i, j};
      } else if(v[i][j] == 'g') {
        v[i][j] = '.';
        gl = {i, j};
      } else if(v[i][j] == '*') {
        bane.push_back({i, j});
      }
    }
  }
  vvi dg(h, vi(w, -1));
  dg[gl.first][gl.second] = 0;
  queue<P> que;
  que.push(gl);
  vi dr = {-1, 1, 0, 0};
  vi dc = {0, 0, -1, 1};
  while(!que.empty()) {
    P now = que.front(); que.pop();
    int d = dg[now.first][now.second];
    for(int i=0;i<(4);++i) {
      int nr = now.first + dr[i], nc = now.second + dc[i];
      if(!(0 <= nr && nr < h && 0 <= nc && nc < w)) continue;
      if(v[nr][nc] != '.') continue;
      if(dg[nr][nc] == -1) {
        dg[nr][nc] = d + 1;
        que.push({nr, nc});
      }
    }
  }
  vvi dbane(h, vi(w, -1));
  for(auto &e: bane) dbane[e.first][e.second] = 0, que.push(e);
  while(!que.empty()) {
    P now = que.front(); que.pop();
    int d = dbane[now.first][now.second];
    for(int i=0;i<(4);++i) {
      int nr = now.first + dr[i], nc = now.second + dc[i];
      if(!(0 <= nr && nr < h && 0 <= nc && nc < w)) continue;
      if(v[nr][nc] != '.') continue;
      if(dbane[nr][nc] == -1) {
        dbane[nr][nc] = d + 1;
        que.push({nr, nc});
      }
    }
  }
  double l = 0.0, r = LINF;
  for(int _=0;_<(500);++_) {
    double mid = (l + r) / 2;
    double su = 0;
    int cnt = 0;
    for(int i=0;i<(h);++i) {
      for(int j=0;j<(w);++j) {
        if(v[i][j] != '.' || gl == make_pair(i, j)) continue;
        cnt++;
        double tmp = 2e18;
        if(dg[i][j] != -1 && tmp > dg[i][j]) tmp = dg[i][j];
        if(dbane[i][j] != -1 && tmp > dbane[i][j] + mid) tmp = dbane[i][j] + mid;
        su += tmp;
      }
    }
    if(cnt * mid < su) {
      l = mid;
    } else {
      r = mid;
    }
  }
  double ans = 2e18;
  if(dg[st.first][st.second] != -1 && ans > dg[st.first][st.second]) ans = dg[st.first][st.second];
  if(dbane[st.first][st.second] != -1 && ans > dbane[st.first][st.second] + l) ans = dbane[st.first][st.second] + l;
  cout << ans << endl;
}

