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