#include <iostream>
#include <queue>
using namespace std;
struct Point{
int x, y;
};
int W, H;
int maze[202][77];
Point e1, e2;
bool e1f = 0;
queue<Point> Q;
int steps = -1;
int main(){
cin >> W >> H;
char temp = cin.get();
for (int i = 0; i < 2*H+1; i++){
for (int j = 0; j < 2*W+1; j++){
char c = cin.get();
if (c == ' ')
maze[i][j] = 0;
else
maze[i][j] = -1;
}
char temp = cin.get();
}
for (int w = 1; w < 2*W+1; w+=2){
if (maze[0][w] == 0){
if (!e1f){
e1.y = 1;
e1.x = w;
e1f = 1;
}
else{
e2.y = 1;
e2.x = w;
}
}
if (maze[2*H][w] == 0){
if (!e1f){
e1.y = 2*H-1;
e1.x = w;
e1f = 1;
}
else{
e2.y = 2*H-1;
e2.x = w;
}
}
}
for (int h = 1; h < 2*H+1; h+=2){
if (maze[h][0] == 0){
if (!e1f){
e1.y = h;
e1.x = 1;
e1f = 1;
}
else{
e2.y = h;
e2.x = 1;
}
}
if (maze[h][2*W] == 0){
if (!e1f){
e1.y = h;
e1.x = 2*W-1;
e1f = 1;
}
else{
e2.y = h;
e2.x = 2*W-1;
}
}
}
maze[e1.y][e1.x] = 1;
Q.push(e1);
while (!Q.empty()){
Point p = Q.front();
Q.pop();
int dya[4] = {-2, 2, 0, 0};
int dxa[4] = {0, 0, -2, 2};
for (int i = 0; i < 4; i++){
int dy = dya[i];
int dx = dxa[i];
if (p.y + dy > 0 && (p.y + dy < 2*H) &&
p.x + dx > 0 && (p.x + dx < 2*W) &&
maze[p.y + dy/2][p.x + dx/2] != -1 &&
(maze[p.y + dy][p.x + dx] == 0 || maze[p.y + dy][p.x + dx] > maze[p.y][p.x]+1)){
maze[p.y + dy][p.x + dx] = maze[p.y][p.x] + 1;
Point k;
k.y = p.y + dy;
k.x = p.x + dx;
Q.push(k);
}
}
}
maze[e2.y][e2.x] = 1;
Q.push(e2);
while (!Q.empty()){
Point p = Q.front();
Q.pop();
int dya[4] = {-2, 2, 0, 0};
int dxa[4] = {0, 0, -2, 2};
for (int i = 0; i < 4; i++){
int dy = dya[i];
int dx = dxa[i];
if (p.y + dy > 0 && p.y + dy < 2*H &&
p.x + dx > 0 && p.x + dx < 2*W &&
maze[p.y + dy/2][p.x + dx/2] != -1 &&
(maze[p.y + dy][p.x + dx] == 0 || maze[p.y + dy][p.x + dx] > maze[p.y][p.x]+1)){
maze[p.y + dy][p.x + dx] = maze[p.y][p.x] + 1;
Point k;
k.y = p.y + dy;
k.x = p.x + dx;
Q.push(k);
}
}
}
/*for (int i = 0; i < 2*H+1; i++){
for (int j = 0; j < 2*W+1; j++)
printf("%3d", maze[i][j]);
cout << "\n";
}*/
for (int i = 1; i < 2*H; i+=2){
for (int j = 1; j < 2*W; j+=2){
if (maze[i][j] > steps)
steps = maze[i][j];
}
}
cout << steps << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFBvaW50ewogICAgaW50IHgsIHk7Cn07CgppbnQgVywgSDsKaW50IG1hemVbMjAyXVs3N107ClBvaW50IGUxLCBlMjsKYm9vbCBlMWYgPSAwOwpxdWV1ZTxQb2ludD4gUTsKaW50IHN0ZXBzID0gLTE7CgppbnQgbWFpbigpewogICAgY2luID4+IFcgPj4gSDsKICAgIGNoYXIgdGVtcCA9IGNpbi5nZXQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMipIKzE7IGkrKyl7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyKlcrMTsgaisrKXsKICAgICAgICAgICAgY2hhciBjID0gY2luLmdldCgpOwogICAgICAgICAgICBpZiAoYyA9PSAnICcpCiAgICAgICAgICAgICAgICBtYXplW2ldW2pdID0gMDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbWF6ZVtpXVtqXSA9IC0xOwogICAgICAgIH0KICAgICAgICBjaGFyIHRlbXAgPSBjaW4uZ2V0KCk7CiAgICB9CgogICAgZm9yIChpbnQgdyA9IDE7IHcgPCAyKlcrMTsgdys9Mil7CiAgICAgICAgaWYgKG1hemVbMF1bd10gPT0gMCl7CiAgICAgICAgICAgIGlmICghZTFmKXsKICAgICAgICAgICAgICAgIGUxLnkgPSAxOwogICAgICAgICAgICAgICAgZTEueCA9IHc7CiAgICAgICAgICAgICAgICBlMWYgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBlMi55ID0gMTsKICAgICAgICAgICAgICAgIGUyLnggPSB3OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChtYXplWzIqSF1bd10gPT0gMCl7CiAgICAgICAgICAgIGlmICghZTFmKXsKICAgICAgICAgICAgICAgIGUxLnkgPSAyKkgtMTsKICAgICAgICAgICAgICAgIGUxLnggPSB3OwogICAgICAgICAgICAgICAgZTFmID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgZTIueSA9IDIqSC0xOwogICAgICAgICAgICAgICAgZTIueCA9IHc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaCA9IDE7IGggPCAyKkgrMTsgaCs9Mil7CiAgICAgICAgaWYgKG1hemVbaF1bMF0gPT0gMCl7CiAgICAgICAgICAgIGlmICghZTFmKXsKICAgICAgICAgICAgICAgIGUxLnkgPSBoOwogICAgICAgICAgICAgICAgZTEueCA9IDE7CiAgICAgICAgICAgICAgICBlMWYgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBlMi55ID0gaDsKICAgICAgICAgICAgICAgIGUyLnggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChtYXplW2hdWzIqV10gPT0gMCl7CiAgICAgICAgICAgIGlmICghZTFmKXsKICAgICAgICAgICAgICAgIGUxLnkgPSBoOwogICAgICAgICAgICAgICAgZTEueCA9IDIqVy0xOwogICAgICAgICAgICAgICAgZTFmID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgZTIueSA9IGg7CiAgICAgICAgICAgICAgICBlMi54ID0gMipXLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbWF6ZVtlMS55XVtlMS54XSA9IDE7CiAgICBRLnB1c2goZTEpOwoKICAgIHdoaWxlICghUS5lbXB0eSgpKXsKICAgICAgICBQb2ludCBwID0gUS5mcm9udCgpOwogICAgICAgIFEucG9wKCk7CiAgICAgICAgaW50IGR5YVs0XSA9IHstMiwgMiwgMCwgMH07CiAgICAgICAgaW50IGR4YVs0XSA9IHswLCAwLCAtMiwgMn07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspewogICAgICAgIAlpbnQgZHkgPSBkeWFbaV07CiAgICAgICAgCWludCBkeCA9IGR4YVtpXTsKICAgICAgICAgICAgaWYgKHAueSArIGR5ID4gMCAmJiAocC55ICsgZHkgPCAyKkgpICYmCiAgICAgICAgICAgICAgICBwLnggKyBkeCA+IDAgJiYgKHAueCArIGR4IDwgMipXKSAmJgogICAgICAgICAgICAgICAgbWF6ZVtwLnkgKyBkeS8yXVtwLnggKyBkeC8yXSAhPSAtMSAmJgogICAgICAgICAgICAgICAgKG1hemVbcC55ICsgZHldW3AueCArIGR4XSA9PSAwIHx8IG1hemVbcC55ICsgZHldW3AueCArIGR4XSA+IG1hemVbcC55XVtwLnhdKzEpKXsKICAgICAgICAgICAgbWF6ZVtwLnkgKyBkeV1bcC54ICsgZHhdID0gbWF6ZVtwLnldW3AueF0gKyAxOwogICAgICAgICAgICBQb2ludCBrOwogICAgICAgICAgICBrLnkgPSBwLnkgKyBkeTsKICAgICAgICAgICAgay54ID0gcC54ICsgZHg7CiAgICAgICAgICAgIFEucHVzaChrKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBtYXplW2UyLnldW2UyLnhdID0gMTsKICAgIFEucHVzaChlMik7CgogICAgd2hpbGUgKCFRLmVtcHR5KCkpewogICAgICAgIFBvaW50IHAgPSBRLmZyb250KCk7CiAgICAgICAgUS5wb3AoKTsKICAgICAgICBpbnQgZHlhWzRdID0gey0yLCAyLCAwLCAwfTsKICAgICAgICBpbnQgZHhhWzRdID0gezAsIDAsIC0yLCAyfTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKyl7CiAgICAgICAgCWludCBkeSA9IGR5YVtpXTsKICAgICAgICAJaW50IGR4ID0gZHhhW2ldOwogICAgICAgICAgICBpZiAocC55ICsgZHkgPiAwICYmIHAueSArIGR5IDwgMipIICYmCiAgICAgICAgICAgICAgICBwLnggKyBkeCA+IDAgJiYgcC54ICsgZHggPCAyKlcgJiYKICAgICAgICAgICAgICAgIG1hemVbcC55ICsgZHkvMl1bcC54ICsgZHgvMl0gIT0gLTEgJiYKICAgICAgICAgICAgICAgIChtYXplW3AueSArIGR5XVtwLnggKyBkeF0gPT0gMCB8fCBtYXplW3AueSArIGR5XVtwLnggKyBkeF0gPiBtYXplW3AueV1bcC54XSsxKSl7CiAgICAgICAgICAgIG1hemVbcC55ICsgZHldW3AueCArIGR4XSA9IG1hemVbcC55XVtwLnhdICsgMTsKICAgICAgICAgICAgUG9pbnQgazsKICAgICAgICAgICAgay55ID0gcC55ICsgZHk7CiAgICAgICAgICAgIGsueCA9IHAueCArIGR4OwogICAgICAgICAgICBRLnB1c2goayk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLypmb3IgKGludCBpID0gMDsgaSA8IDIqSCsxOyBpKyspewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMipXKzE7IGorKykKICAgICAgICAgICAgcHJpbnRmKCIlM2QiLCBtYXplW2ldW2pdKTsKICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICB9Ki8KCiAgICBmb3IgKGludCBpID0gMTsgaSA8IDIqSDsgaSs9Mil7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAyKlc7IGorPTIpewogICAgICAgICAgICBpZiAobWF6ZVtpXVtqXSA+IHN0ZXBzKQogICAgICAgICAgICAgICAgc3RlcHMgPSBtYXplW2ldW2pdOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IHN0ZXBzIDw8ICJcbiI7Cgp9Cg==