#include<bits/stdc++.h>
using namespace std;

const int M = 1000000007;
const long long LM = (long long)1e17;
int d[5] = { 0, 1, 0, -1, 0 };

int main() {
    int w, h, si, sj, gi, gj;
    cin >> w >> h;
    vector<string> s(h);
    queue<pair<int, int>> q;
    vector<vector<int>> dsp(h, vector<int>(w, M));
    vector<vector<long long>> dg(h, vector<long long>(w, LM * 2));
    for (int i = 0; i < h; ++i) {
        cin >> s[i];
        for (int j = 0; j < w; ++j) {
            if (s[i][j] == 's') {
                si = i;
                sj = j;
            }
            else if (s[i][j] == 'g') {
                gi = i;
                gj = j;
                dg[i][j] = 0;
            }
            else if (s[i][j] == '*') {
                dsp[i][j] = 0;
                q.push(make_pair(i, j));
            }
        }
    }
    while (!q.empty()) {
        pair<int, int> p = q.front();
        q.pop();
        int pi = p.first, pj = p.second;
        for (int i = 0; i < 4; ++i) {
            int ti = pi + d[i], tj = pj + d[i + 1];
            if (s[ti][tj] != '#' && dsp[ti][tj] > dsp[pi][pj] + 1) {
                dsp[ti][tj] = dsp[pi][pj] + 1;
                q.push(make_pair(ti, tj));
            }
        }
    }
    q.push(make_pair(gi, gj));
    while (!q.empty()) {
        pair<int, int> p = q.front();
        q.pop();
        int pi = p.first, pj = p.second;
        for (int i = 0; i < 4; ++i) {
            int ti = pi + d[i], tj = pj + d[i + 1];
            if (s[ti][tj] != '#' && s[ti][tj] != '*' && dg[ti][tj] > dg[pi][pj] + 1) {
                dg[ti][tj] = dg[pi][pj] + 1;
                q.push(make_pair(ti, tj));
            }
        }
    }
    long long l = 0, r = LM;
    double k = -1;
    while (l <= r) {
        long long m = (l + r) / 2;
        int c = 0;
        long long dist = 0;
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < w; ++j) {
                if (s[i][j] == 's' || s[i][j] == '.') {
                    ++c;
                    if (dg[i][j] > dsp[i][j] + m) {
                        --c;
                        dist += dsp[i][j];
                    }
                    else {
                        dist += dg[i][j];
                    }
                }
            }
        }
        k = dist / (double)c;
        if (m - 1e-9 < k && k < m + 1) {
            break;
        }
        else if (m < k) {
            l = m + 1;
        }
        else {
            r = m - 1;
        }
    }
    printf("%.12lf\n", min((double)dg[si][sj], dsp[si][sj] + k));
    return 0;
}