;;;; q
(defstruct queue (entrance nil) (exit nil))

(defun enqueue (item queue)
  (let ((cell (list item)))
    (if (queue-entrance queue)
        (setf (cdr (queue-entrance queue)) cell)
        (setf (queue-exit queue) cell))
    (setf (queue-entrance queue) cell)))

(defun dequeue (queue)
  (when (queue-exit queue)
    (prog1 (pop (queue-exit queue))
      (unless (queue-exit queue)
        (setf (queue-entrance queue) nil)))))

;;;;
(defmacro loop-wh ((i j) &body body)
    `(loop :for ,i :from 0 :to (1- h)
           :do (loop :for ,j :from 0 :to (1- w)
                     :do (progn ,@body))))
;;;; main
(let* ((h (read))
       (w (read))
       (s (make-array (list h w)))
       (e (make-array (list h w) :initial-element nil))
       (ans 0))
  ;;
  (loop :for i :from 0 :to (1- h)
        :for l := (read-line)
        :do (loop :for j :from 0 :to (1- w)
                  :do (setf (aref s i j) (char= (aref l j) #\.))))
  ;
  (loop :for i :from 0 :to (1- h)
        :do (loop :for j :from 0 :to (1- w)
                  :do (loop :for (di . dj) :in '((0 . -1) (0 . 1) (1 . 0) (-1 . 0))
                            :if (and (<= 0 (+ i di) (1- h)) (<= 0 (+ j dj) (1- w)) (aref s i j))
                            :do (push (cons (+ i di) (+ j dj)) (aref e i j)))))
  ;
  (loop :for sij :from 0 :to (1- (* h w)) :for si := (floor (/ sij w)) :for sj := (mod sij w)
        :do  (loop :for eij :from 0 :to (1- (* h w)) :for ei := (floor (/ eij w)) :for ej := (mod eij w)
                   :do (when (aref s ei ej)
                         (let ((q (make-queue))
                               (chk (make-array (list h w) :initial-element nil)))
                           (enqueue (list* si sj 0) q)
                           (loop :while (queue-exit q)
                                 :for (i j . p) := (dequeue q)
                                 :do (unless (aref chk i j)
                                       (setf (aref chk i j) t)
                                       (when (and (= i ei) (= j ej))
                                         (setf ans (max ans p))
                                         (return))
                                       (loop :for (y . x) :in (aref e i j)
                                             :if (not (aref chk y x))
                                             :do (enqueue (list* y x (1+ p)) q))))))))
  ;
  (format t "~A~%" ans))
