#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int w, h, dir[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }, book[205][80], ans[205][80];
char a[205][80];
struct e {
int x, y, u;
} t1, t2;
void bfs(int sx, int sy) {
queue<e> q;
t1.x = sx;
t1.y = sy;
book[sx][sy] = 1;
t1.u = 0;
q.push(t1);
while (!q.empty()) {
t1 = q.front();
int u1 = t1.x, u2 = t1.y;
if (ans[u1][u2] == -1) {
ans[u1][u2] = t1.u;
} else {
ans[u1][u2] = min(t1.u, ans[u1][u2]);
}
q.pop();
for (int p = 0; p < 4; p++) {
int dx1 = t1.x + dir[p][0], dy1 = t1.y + dir[p][1], dx2 = t1.x + dir[p][0] * 2,
dy2 = t1.y + dir[p][1] * 2;
if (dx2 >= 1 && dx2 <= h && dy2 >= 1 && dy2 <= w && a[dx1][dy1] == ' ' && book[dx2][dy2] == 0) {
book[dx2][dy2] = 1;
t2.x = dx2;
t2.y = dy2;
t2.u = t1.u + 1;
q.push(t2);
}
}
}
return;
}
int main() {
int flag1 = 0, flag2 = 0, lx1, ly1, lx2, ly2;
scanf("%d %d", &w, &h);
w = w * 2 + 1;
h = h * 2 + 1;
for (int p = 1; p <= h; p++) {
char i = getchar();
for (int k = 1; k <= w; k++) {
a[p][k] = getchar();
}
}
for (int p = 1; p <= h; p++) {
if (a[p][1] == ' ' && flag1 == 0) {
lx1 = p;
ly1 = 2;
a[p][1] = '|';
flag1 = 1;
} else if (a[p][1] == ' ' && flag2 == 0) {
lx2 = p;
ly2 = 2;
a[p][1] = '|';
flag2 = 1;
}
}
for (int p = 1; p <= h; p++) {
if (a[p][w] == ' ' && flag1 == 0) {
lx1 = p;
ly1 = w - 1;
a[p][w] = '|';
flag1 = 1;
} else if (a[p][w] == ' ' && flag2 == 0) {
lx2 = p;
ly2 = w - 1;
a[p][w] = '|';
flag2 = 1;
}
}
for (int p = 1; p <= w; p++) {
if (a[1][p] == ' ' && flag1 == 0) {
lx1 = 2;
ly1 = p;
a[1][p] = '-';
flag1 = 1;
} else if (a[1][p] == ' ' && flag2 == 0) {
lx2 = 2;
ly2 = p;
a[1][p] = '-';
flag2 = 1;
}
}
for (int p = 1; p <= w; p++) {
if (a[h][p] == ' ' && flag1 == 0) {
lx1 = h - 1;
ly1 = p;
a[h][p] = '-';
flag1 = 1;
} else if (a[h][p] == ' ' && flag2 == 0) {
lx2 = h - 1;
ly2 = p;
a[h][p] = '-';
flag2 = 1;
}
}
memset(ans, -1, sizeof(ans));
bfs(lx1, ly1);
memset(book, 0, sizeof(book));
bfs(lx2, ly2);
int MAX = 0;
for (int p = 2; p < h; p += 2) {
for (int k = 2; k < w; k += 2) {
MAX = max(MAX, ans[p][k]);
}
}
cout << MAX + 1;
return 0;
}