/*
#include <stdio.h>
int arr[101][101]={};
int queue[10002]={};
int front,back,n;
void push(int x)
{
back++;
queue[back]=x;
}
int pop()
{
int tem;
if(front==back){
return 0;
}
else{
front++;
tem=queue[front];
return tem;
}
}
void bfs(int x, int y)
{
int a,b,c,d,num=2;
push(x*1000+y);
d=back;
for(;front!=back;){
c=pop();
a=c/1000;
b=c%1000;
if(b-1>=1&&arr[a][b-1]==0){
arr[a][b-1]=num;
push(a*1000+(b-1));
}
if(b+1<=n&&arr[a][b+1]==0){
arr[a][b+1]=num;
push(a*1000+(b+1));
}
if(a-1>=1&&arr[a-1][b]==0){
arr[a-1][b]=num;
push((a-1)*1000+b);
}
if(a+1<=n&&arr[a+1][b]==0){
arr[a+1][b]=num;
push((a+1)*1000+b);
}
if(front==d){
num++;
d=back;
}
}
return ;
}
int main()
{
int x,y;
scanf("%d",&n);
scanf("%d %d",&x,&y);
arr[x][y]=1;
bfs(x,y);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
*/
#include <stdio.h>
int arr[1001][1001]={};
long long int queue[10000002]={};
int front=-1,back=-1,n,m,num=0;
void view()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
printf("num=%d\n\n",num);
}
void push(int x)
{
back++;
queue[back]=x;
}
long long int pop()
{
long long int tem;
if(front==back){
return 0;
}
else{
front++;
tem=queue[front];
return tem;
}
}
void bfs()
{
long long int a,b,c,d;
d=back;
for(;front!=back;){
c=pop();
a=c/10000;
b=c%10000;
if(b-1>=1&&arr[a][b-1]==0){
arr[a][b-1]=1;
push(a*10000+(b-1));
}
if(b+1<=m&&arr[a][b+1]==0){
arr[a][b+1]=1;
push(a*10000+(b+1));
}
if(a-1>=1&&arr[a-1][b]==0){
arr[a-1][b]=1;
push((a-1)*10000+b);
}
if(a+1<=n&&arr[a+1][b]==0){
arr[a+1][b]=1;
push((a+1)*10000+b);
}
if(front==d){
num++;
d=back;
//view();
}
}
return ;
}
int main()
{
int x,y,i,j,k;
scanf("%d %d",&m,&n);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&arr[i][j]);
if(arr[i][j]==1){
push(i*10000+j);
k++;
}
}
}
if(k==n*m){
printf("0");
return 0;
}
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(arr[i][j]==0){
printf("-1");
return 0;
}
}
}
printf("%d",num-1);
return 0;
}



