using DataStructures
const double = Float64
const int = Int64

parseint(x) = parse(int, x)
readint() = map(parseint, split(readline()))

function main()
  H,W = readint()
  S = String[]
  for _ in 1:H
    s = readline()
    append!(S,[s])
  end

  Lmax = H*W + 1
  d = Array{int,4}(undef, H,W,H,W)
  d .= H*W + 1

  mat = Array{int,4}(undef,H,W,H,W)
  mat .= 0

  for i in 1:H, j in 1:W
    S[i][j] == '#' && continue
    

    if i+1 <=H && S[i+1][j] == '.'
      mat[i,j,i+1,j] = 1
      mat[i+1,j,i,j] = 1
    end
    if j+1 <= W &&S[i][j+1] == '.'
      mat[i,j,i,j+1] = 1
      mat[i,j+1,i,j] = 1
    end
  end

  for i1 in 1:H, j1 in 1:W
    for i2 in 1:H, j2 in 1:W
      i1 == i2 && j1 == j2 && continue
      if mat[i1,j1, i2, j2] == 1
        d[i1,j1,i2,j2] = 1
      end
    end
  end
  for i1 in 1:H, j1 in 1:W
    for i2 in 1:H, j2 in 1:W
      for i3 in 1:H, j3 in 1:W
        d[i2,j2,i3,j3] = min(d[i2,j2,i3,j3] , d[i2,j2,i1,j1] + d[i3,j3,i1,j1])
      end
    end
  end

  s = 0
  for i in 1:H, j in 1:W
    for i2 in 1:H, j2 in 1:W
      if d[i,j,i2,j2] > s && d[i,j,i2,j2]<Lmax
        s = d[i,j,i2,j2]
      end
    end
  end
  println(s)
  #println(S[2][4])
  #println(S)
end



main()