Problem:
Score : 400 points

Problem Statement

Takahashi has a maze, which is a grid of H \times W squares with H horizontal rows and W vertical columns.

The square at the i-th row from the top and the j-th column is a "wall" square if S_{ij} is #, and a "road" square if S_{ij} is ..

From a road square, you can move to a horizontally or vertically adjacent road square.

You cannot move out of the maze, move to a wall square, or move diagonally.

Takahashi will choose a starting square and a goal square, which can be any road squares, and give the maze to Aoki.

Aoki will then travel from the starting square to the goal square, in the minimum number of moves required.

In this situation, find the maximum possible number of moves Aoki has to make.

Constraints

1 \leq H,W \leq 20

S_{ij} is . or #.

S contains at least two occurrences of ..

Any road square can be reached from any road square in zero or more moves.

Input

Input is given from Standard Input in the following format:

H W
S_{11}...S_{1W}
:
S_{H1}...S_{HW}

Output

Print the maximum possible number of moves Aoki has to make.

Sample Input 1

3 3
...
...
...

Sample Output 1

4

If Takahashi chooses the top-left square as the starting square and the bottom-right square as the goal square, Aoki has to make four moves.

Sample Input 2

3 5
...#.
.#.#.
.#...

Sample Output 2

10

If Takahashi chooses the bottom-left square as the starting square and the top-right square as the goal square, Aoki has to make ten moves.

Solution in Python (3.4.3) (judge verdict: Wrong Answer)

# ＢＦＳ
# グリッド
# スタート位置 と ゴール位置 の全パターンの経路を探索 → 最長経路
 # ※ 要削除

from collections import deque

h,w = map(int,input().split())
pic = [list(input()) for i in range(h)]
visited = [[0 for i in range(w)] for i in range(h)] # 各位置までに必要な移動回数記録用メモ
queue = deque([]) # 探索候補のキューを dequeオブジェクトとして初期化
print(h,w) # ※
print(pic) # ※
print(visited) # ※

ans = 0

for i in range(h):
    for j in range(w):
        if pic[i][j] == '.': # スタート位置を決めて...
            visited[i][j] = 1 # 訪問 '1' を記録して..._後で '1' 引く
            queue.append([i,j]) # 探索候補に積む

            dy_dx = [[1,0],[0,1],[-1,0],[0,-1]] # 探索子、4方向

            while queue:
                now = queue.popleft() # 現在地を探索候補から popleft する
                for k in range(4): # 現在地から4方向の探索先を生成
                    y = now[0]+dy_dx[k][0] # 探索子を使う
                    x = now[1]+dy_dx[k][1] # 〃
                    if 0 <= y < h and 0 <= x < w: # 探索の条件4つを2行で確認
                        if pic[y][x] != '#' and visited[y][x] == 0:
                            visited[y][x] = visited[now[0]][now[1]] + 1 # 移動回数のカウント_ひとつ前の回数に'1'を足す
                            queue.append([y,x]) # 現在地を探索候補に積む
        print(visited) # ※ 
        for l in range(h): # 一探索ごとに'max'を比較 → 記録する
            for m in range(w):
                ans = max(ans,visited[l][m])

        queue = deque([]) # 探索候補のキューを初期化
        visited = [[0 for i in range(w)] for i in range(h)] # 移動回数記録用メモを初期化

print(ans-1)