#include <bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<int, int> PII;
#define pb push_back
int n, m;
char mp[1005][1005];
int f[12];
struct node {
int x, y, t;
bool operator < (const node & k) const {
return t > k.t;
}
};
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
bool vis[1005][1005];
inline bool check(int x, int y) {
if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || mp[x][y] == 'X') return false;
return true;
}
inline bool judge(int x, int y, int i, int j, int ddx, int ddy) {
if (j < 0) return true;
int dx = x + dir[i][0] * f[j];
int dy = y + dir[i][1] * f[j];
if (dx == ddx) {
for (int k = dy; k <= ddy; ++k)
if (mp[dx][k] == 'X') return false;
} else {
for (int k = dx; k <= ddx; ++k)
if (mp[k][dy] == 'X') return false;
}
return true;
}
int bfs() {
priority_queue<node> q;
q.push({1, 1, 0});
vis[1][1] = true;
while (!q.empty()) {
node u = q.top(); q.pop();
int x = u.x, y = u.y, t = u.t;
if (mp[x][y] == '#') return t;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < log2(n); ++j) {
int dx = x + dir[i][0] * f[j];
int dy = y + dir[i][1] * f[j];
if (check(dx, dy) && judge(x, y, i, j - 1, dx, dy)) {
vis[dx][dy] = true;
q.push({dx, dy, t + 1});
}
}
}
}
return -1;
}
int main(){
scanf("%d %d", &n, &m);
f[0] = 1;
for (int i = 1; i <= 10; ++i) f[i] = f[i - 1] * 2;
for (int i = 1; i <= n; ++i)
scanf("%s", mp[i] + 1);
printf("%d\n", bfs());
return 0;
}