from collections import deque
INF = 10**18
h,w = map(int,input().split())
li = [list(input()) for i in range(h)]


def bfs(sy,sx):
    #頂点をINFで初期化
    d = [[INF]*w for i in range(h)]
    
    #移動４方向のベクトル
    dx = [1,0,-1,0]
    dy = [0,1,0,-1]

    #スタート位置とゴール位置を探す
    """
    for i in range(h):
        for j in range(w):
            if li[i][j]  == "s":
                sx = i
                sy = j
            if li[i][j] == "g":
                gx = i
                gy = j
    """
    #スタート地点をキューにいれ、頂点を０にする
    que = deque([])
    que.append((sy,sx))
    d[sy][sx] = 0

    #キューが空になるまでループ（行ける要素がなくなるまで）
    while que:
        # キューの先頭を取り出す
        p = que.popleft()
        # 取り出してきた状態がゴールなら探索をやめる
        """
        if p[0] == gx and p[1] == gy:
            break
        """
        # 移動4方向をループ
        for i in range(4):
            nx = p[1] + dx[i]
            ny = p[0] + dy[i]

            #壁との判定とすでに訪れたかどうかをチェック
            if 0<=nx and nx < w and 0 <= ny and ny < h:
                if li[ny][nx] != "#" and d[ny][nx] == INF:
                    #移動できる点なのでキューについか
                    que.append((ny,nx))
                    #前の点+1で移動できる
                    d[ny][nx] = d[p[0]][p[1]] + 1
    return d
ans = 0
for i in range(h):
    for j in range(w):
        c = bfs(i,j)
        for k in range(h):
            for l in range(w):
                if c[k][l] == INF:
                    continue
                ans = max(ans,c[k][l])
print(ans)