/*
ID :
LANG: C++11
TASK: maze1
*/
#include<iostream>
#include<string>
#include<queue>
using namespace std;
int main()
{
freopen("maze1.in", "r", stdin);
freopen("maze1.out", "w", stdout);
char maze[210][80] ={};
queue<pair<int, int>> bfs;
typedef pair<int, int> coord;
queue<int> dis;
int tdis = 0;
int W, H;
cin >> W >> H;
int exit[2] = {};
for (int i = 0; i < 2 * H + 1; i ++){
cin.get();
cin.get(maze[i], 80);
if (i == 0 || i == 2 * H){
for (int j = 0; j < 2 * W + 1; j ++){
if (maze[i][j] == ' '){
if (i == 0)
exit[0] = 1;
if (i == 2 * H)
exit[0] = 2 * H - 1;
exit[1] = j;
bfs.push(make_pair(exit[0], exit[1])); dis.push(1);
}
}
}
else{
if (maze[i][0] == ' '){
exit[0] = i; exit[1] = 1; bfs.push(make_pair(exit[0], exit[1])); dis.push(1);
}
else if (maze[i][2 * W] == ' '){
exit[0] = i; exit[1] = 2 * W - 1; bfs.push(make_pair(exit[0], exit[1])); dis.push(1);
}
}
}
while (!bfs.empty()){
coord t = bfs.front(); bfs.pop();
tdis = dis.front(); dis.pop();
if (t.first >= 3 && maze[t.first - 1][t.second] == ' ' && maze[t.first - 2][t.second] != 'O') {//O, occupied
maze[t.first - 2][t.second] = 'O';
bfs.push(make_pair(t.first - 2, t.second)); dis.push(tdis + 1);
}
if (t.first <= 2 * H - 3 && maze[t.first + 1][t.second] == ' ' && maze[t.first + 2][t.second] != 'O') {
maze[t.first + 2][t.second] = 'O';
bfs.push(make_pair(t.first + 2, t.second)); dis.push(tdis + 1);
}
if (t.second >= 3 && maze[t.first][t.second - 1] == ' ' && maze[t.first][t.second - 2] != 'O') {
maze[t.first][t.second - 2] = 'O';
bfs.push(make_pair(t.first, t.second - 2)); dis.push(tdis + 1);
}
if (t.second <= 2 * W - 3 && maze[t.first][t.second + 1] == ' ' && maze[t.first][t.second + 2] != 'O') {
maze[t.first][t.second + 2] = 'O';
bfs.push(make_pair(t.first, t.second + 2)); dis.push(tdis + 1);
}
}
cout << tdis << endl;
return 0;
}