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 Fortran (gfortran v4.8.4) (judge verdict: Accepted)

program ABC151D
    implicit none
    integer::H,W
    character(20)::S
    integer,allocatable,dimension(:,:)::maze
    integer,allocatable,dimension(:,:)::Route
    integer::i,j
    integer::ans
    read*,H,W
    allocate(maze(H,W))
    maze=0
    do i=1,H
        read*,S
        do j=1,W
            if(S(j:j)==".")maze(i,j)=1
        end do
    end do
    allocate(Route(point(H,W),point(H,W)))
    Route=1000
    do i=1,W
        if(maze(geti(i),getj(i))==1)then
            Route(i,i)=0
            if(i/=1)then
                if(maze(geti(i),getj(i)-1)==1)then
                    Route(i,i-1)=1
                    Route(i-1,i)=1
                endif
            endif
        endif
    end do
    do i=W+1,H*W
        if(maze(geti(i),getj(i))==1)then
            Route(i,i)=0
            if(geti(i)/=1)then
                if(maze(geti(i),getj(i)-1)==1)then
                    Route(i,i-1)=1
                    Route(i-1,i)=1
                endif
            endif
            if(maze(geti(i)-1,getj(i))==1)then
                Route(i,i-W)=1
                Route(i-W,i)=1
            endif
        endif
    end do
    call Warshall_Floyd(H*W,Route)
    ans=0
    do i=1,H*W
        do j=1,H*W
            if(Route(i,j)/=1000)ans=max(ans,Route(i,j))
        end do
    end do
    print"(i0)",ans
contains
function point(i,j)
    integer::i,j
    integer::point
    point=(i-1)*W+j
end function
function geti(i)
    integer::i
    integer::geti
    geti=(i-1)/W +1
end function
function getj(i)
    integer::i
    integer::getj
    getj=mod(i-1,W)+1
end function
subroutine Warshall_Floyd(n,Route)
  !nは頂点の数、Routeは全ての経路の長さを記録したもの
  !以下の型宣言は場合に応じて変えること
  implicit none
  integer, intent(in) :: n
  integer, intent(inout) :: Route(n, n)
  integer :: i, j, k

    do k = 1, n
      do i = 1, n
        do j = 1, n
          Route(j, i) = min( Route(j, i), Route(j, k) + Route(k, i))
        end do
      end do
    end do
end subroutine Warshall_Floyd
end program ABC151D