/*
#include <stdio.h>
#define MAX 1000
int map[MAX][MAX] = {};
int queue[2][MAX] = {};
int a,b;
int sum = 0;
int f = 0;
int r = 0;
void enque(int x,int y) {
r++;
queue[0][r] = x;
queue[1][r] = y;
}
int deque0() {
return queue[0][f];
}
int deque1() {
return queue[1][f];
}
void bfs(int c, int d) {
map[c][d] = 1;
for(int i = -1; i<=1; i++) {
for(int j = -1; j<=1; j++) {
if(i == 0 && j == 0) {
map[c+i][d+j] = 1;
}
else {
if(map[c+i][d+j] == 2) {
enque(c+i,d+j);
map[c+i][d+j] = 1;
}
}
}
}
while(f != r) {
f++;
int x = deque0();
int y = deque1();
map[x][y] = 1;
for(int i = -1; i<=1; i++) {
for(int j = -1; j<=1; j++) {
if(i == 0 && j == 0) {
map[x+i][y+j] = 1;
}
else {
if(map[x+i][y+j] == 2) {
enque(x+i,y+j);
map[x+i][y+j] = 1;
}
}
}
}
}
sum++;
}
int main() {
char c;
scanf("%d %d", &a, &b);
for(int i = 1; i<=b; i++) {
for(int j = 1; j<=a; j++) {
scanf(" %c", &c);
if(c == '.') {
map[i][j] = 1;
}
else if(c == 'L') {
map[i][j] = 2;
}
}
}
// for(int i = 0; i<=a+1; i++) {
// for(int j = 0; j<=b+1; j++) {
// printf("%d ", map[i][j]);
// }
// printf("\n");
// }
for(int i = 1; i<=b; i++) {
for(int j = 1; j<=a; j++) {
if(map[i][j] == 2) {
bfs(i,j);
}
}
}
printf("%d", sum);
}
*/
#include <stdio.h>
#define MAX 1004
int queue[2][10000000] = {};
int a[MAX][MAX] = {};
int f = -1;
int r = -1;
int m,n;
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int check() {
int sum = 0;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i][j] == 0 || a[i][j] == -1) {
sum++;
}
}
}
if(sum == 0) {
printf("0");
return 1;
}
else {
return 0;
}
}
void setArr() {
for(int i=0; i<=n; i++) {
a[i][0] = -1;
a[i][m+1] = -1;
}
for(int i = 0; i<=m; i++) {
a[0][i] = -1;
a[n+1][i] = -1;
}
a[n+1][m+1] = -1;
}
void enque(int a,int b) {
r++;
queue[0][r] = a; //x좌표 저장
queue[1][r] = b; //y좌표 저장
}
int deque0() {
return queue[0][f];
}
int deque1() {
return queue[1][f];
}
void bfs(int x,int y) {
if(a[x+1][y] == 0) {
enque(x+1,y);
a[x+1][y] = 1;
}
if(a[x][y+1] == 0) {
enque(x,y+1);
a[x][y+1] = 1;
}
if(a[x-1][y] == 0) {
enque(x-1,y);
a[x-1][y] = 1;
}
if(a[x][y-1] == 0) {
enque(x,y-1);
a[x][y-1] = 1;
}
}
int main() {
int asd;
int day = -1;
scanf("%d %d", &m, &n);
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=m; j++) {
scanf("%d", &a[i][j]);
}
}
setArr();
// for(int i = 0; i<=n+1; i++) {
// for(int j = 0; j<=m+1; j++) {
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
if(check() == 1) {
return 0;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i][j] == 1) {
enque(i,j);
}
}
}
asd = r;
while(f != r) {
while(f < asd) {
f++;
int x = deque0();
int y = deque1();
bfs(x,y);
}
day++;
asd = r;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i][j] == 0) {
printf("-1");
return 0;
}
}
}
printf("%d", day);
return 0;
}