//グリッドグラフ テンプレート
fun main(args: Array<String>) {
    val dx = listOf(1, 0, -1, 0)
    val dy = listOf(0, 1, 0, -1)
    val (H, W) = listOfInt()
    var maze = Array<String>(H) { next() }
    var Q = Queue<Triple<Int, Int, Int>>()
    fun xfs(h: Int, w: Int, gh: Int, gw: Int): Int {
        var visit = Array<IntArray>(H) { IntArray(W) { -1 } }
        Q.enqueue(Triple(h, w, 0))
        visit[h][w] = 0
        while (!Q.isEmpty()) {
            val q = Q.dequeue()!!
            val h = q.first
            val w = q.second
            val k = q.third
            visit[h][w] = k
            if (h == gh && w == gw) break
            for (n in 0 .. 3) {
                val nh = h + dx[n]; val nw = w + dy[n]
                if (nh < 0 || nh >= H || nw < 0 || nw >= W) continue
                if (maze[nh][nw] == '#') continue
                if (visit[nh][nw] != -1) continue
                Q.enqueue(Triple(nh, nw, k + 1))
            }
        }
        Q.elements.removeAll { true }
        return visit[gh][gw]
    }
    var ans = 0
    val S = H * W
    for (s in 0 until S) {
        val sh = s / W
        val sw = s % W
        if (maze[sh][sw] == '#') continue
        for (g in s until S) {
            if (s == g) continue
            val gh = g / W
            val gw = g % W
            if (maze[gh][gw] == '#') continue
            val l = xfs(sh, sw, gh, gw)
            ans = Math.max(ans, l)
        }
    }
    println(ans)
}
fun next() = readLine()!!
fun nextInt() = Integer.parseInt(next())
fun listOfString() = next().split(" ")
fun listOfInt(delta: Int = 0) = listOfString().map { Integer.parseInt(it) + delta }
fun printErr(value: Any) = System.err.println(value)
class Queue<T> {
    val elements = mutableListOf<T>()
    fun isEmpty() = elements.isEmpty()
    fun count() = elements.size
    fun enqueue(item: T) = elements.add(item)
    fun dequeue() = if (!isEmpty()) elements.removeAt(0) else null
    fun peek() = if (!isEmpty()) elements[0] else null

    override fun toString(): String = elements.toString()
}
fun <T> Queue<T>.push(items: Collection<T>) = items.forEach { this.enqueue(it) }
