
#include<iostream>
#include<vector>
using namespace std;
typedef struct
{
int x;
int y;
}node;
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int main()
{
int M, N;
cin >> M >> N;
vector<vector<char>> m(M);
vector<vector<int>> num(M);
for (int x = 0; x < M; x++)
{
m[x].resize(N);
num[x].resize(N);
}
for (int x = 0; x < M; x++)
{
getchar();
for (int y = 0; y < N; y++)
{
scanf("%c", &m[x][y]);
}
}
num[0][0] = 1;
m[0][0] = '0';
int flag = 1;
node t = { 0,0 };
vector<node>q;
q.push_back(t);
while (q.size())
{
t = q[0];
q.erase(q.begin());
if (t.x == M - 1 && t.y == N - 1)
{
flag = 0;
cout << num[M - 1][N - 1];
break;
}
for (int i = 0; i < 4; i++)
{
int _x = t.x + dx[i];
int _y = t.y + dy[i];
if (_x < 0 || _x >= M || _y < 0 || _y >= N)
{
continue;
}
if (m[_x][_y] == '1')
{
m[_x][_y] = '0';
num[_x][_y] = num[t.x][t.y] + 1;
node new_t = { _x,_y };
q.push_back(new_t);
}
}
}
if (flag)
{
cout << -1;
}
return 0;
}