//2234
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#define MAX 1001
using namespace std;
int matrix[MAX][MAX], visited[MAX][MAX], cX[4]={0,1,0,-1}, cY[4]={1,0,-1,0};
int ans=0;
void bfs(int maxX, int maxY){
queue<pair<int,int>> q;
for(int y=0;y<maxY;y++){
for(int x=0;x<maxX;x++)
if(matrix[y][x]==1&&!visited[y][x]) q.push(make_pair(x,y));
}
while(!q.empty()){ // 종료조건 추가해야됨 que에 push할게 없는데 matrix[x][y]==0인 케이스
//pop하는 과정
while(!q.empty()){
int x=q.front().first, y=q.front().second;
visited[y][x]=1; q.pop();
for(int i=0;i<4;i++){
if(matrix[y+cY[i]][x+cX[i]]!=-1) matrix[y+cY[i]][x+cX[i]]=1;
}
} ans++;
//push하는 과정
for(int y=0;y<maxY;y++){
for(int x=0;x<maxX;x++){
if(matrix[y][x]==1&&!visited[y][x]) q.push(make_pair(x,y));
}
}
}
for(int y=0;y<maxY;y++){
for(int x=0;x<maxX;x++){
if(matrix[y][x]==0) {cout<<"-1"; return;}
}
} cout<<ans-1;
}
int main(){
int M,N; cin>>M>>N;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++)
cin>>matrix[i][j];
} bfs(M,N);
}
/*
* bfs를 이용
1. (matrix[x][y]==1, visited[x][y]=0)인값들을 쭉훑어서 queue에 push
2. 큐가 빌때까지 pop하면서 상하좌우값이 0이면 1로 바꿀예정 -1이면 그냥 넘어감
3. 모두 pop했을때 최소날 하루++ / (pop할때 visited[x][y]=1 해줄것)
1,2,3을 계속 반복한후 matrix가 모두 1이면 최소날 출력
근데 저장될때부터 모든 토마토가 익어있는 상탠지 모두 익지 못하는 상탠지 판단하는게 고민이네
*/
Ly8yMjM0CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8dXRpbGl0eT4KI2RlZmluZSBNQVggMTAwMQp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbWF0cml4W01BWF1bTUFYXSwgdmlzaXRlZFtNQVhdW01BWF0sIGNYWzRdPXswLDEsMCwtMX0sIGNZWzRdPXsxLDAsLTEsMH07CmludCBhbnM9MDsKCnZvaWQgYmZzKGludCBtYXhYLCBpbnQgbWF4WSl7CiAgICBxdWV1ZTxwYWlyPGludCxpbnQ+PiBxOwogICAgZm9yKGludCB5PTA7eTxtYXhZO3krKyl7CiAgICAgICAgICAgIGZvcihpbnQgeD0wO3g8bWF4WDt4KyspCiAgICAgICAgICAgICAgICBpZihtYXRyaXhbeV1beF09PTEmJiF2aXNpdGVkW3ldW3hdKSBxLnB1c2gobWFrZV9wYWlyKHgseSkpOwogICAgfQogICAKICAgIHdoaWxlKCFxLmVtcHR5KCkpeyAvLyDsooXro4zsobDqsbQg7LaU6rCA7ZW07JW865CoIHF1ZeyXkCBwdXNo7ZWg6rKMIOyXhuuKlOuNsCBtYXRyaXhbeF1beV09PTDsnbgg7LyA7J207IqkCiAgICAgICAgLy9wb3DtlZjripQg6rO87KCVCiAgICAgICAgd2hpbGUoIXEuZW1wdHkoKSl7CiAgICAgICAgICAgIGludCB4PXEuZnJvbnQoKS5maXJzdCwgeT1xLmZyb250KCkuc2Vjb25kOwogICAgICAgICAgICB2aXNpdGVkW3ldW3hdPTE7IHEucG9wKCk7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8NDtpKyspewogICAgICAgICAgICAgICAgaWYobWF0cml4W3krY1lbaV1dW3grY1hbaV1dIT0tMSkgbWF0cml4W3krY1lbaV1dW3grY1hbaV1dPTE7CiAgICAgICAgICAgIH0KICAgICAgICB9IGFucysrOwogICAgICAgIAogICAgICAgIC8vcHVzaO2VmOuKlCDqs7zsoJUKICAgICAgICBmb3IoaW50IHk9MDt5PG1heFk7eSsrKXsKICAgICAgICAgICAgZm9yKGludCB4PTA7eDxtYXhYO3grKyl7CiAgICAgICAgICAgICAgICBpZihtYXRyaXhbeV1beF09PTEmJiF2aXNpdGVkW3ldW3hdKSBxLnB1c2gobWFrZV9wYWlyKHgseSkpOwogICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgfQogICAgfSAKICAgIAogICAgZm9yKGludCB5PTA7eTxtYXhZO3krKyl7CiAgICAgICAgZm9yKGludCB4PTA7eDxtYXhYO3grKyl7CiAgICAgICAgICAgIGlmKG1hdHJpeFt5XVt4XT09MCkge2NvdXQ8PCItMSI7IHJldHVybjt9CiAgICAgICAgfQogICAgfSBjb3V0PDxhbnMtMTsKfQoKaW50IG1haW4oKXsKICAgIGludCBNLE47IGNpbj4+TT4+TjsKICAgIGZvcihpbnQgaT0wO2k8TjtpKyspewogICAgICAgIGZvcihpbnQgaj0wO2o8TTtqKyspCiAgICAgICAgICAgIGNpbj4+bWF0cml4W2ldW2pdOwogICAgfSBiZnMoTSxOKTsKfQovKgoqIGJmc+ulvCDsnbTsmqkKICAxLiAobWF0cml4W3hdW3ldPT0xLCB2aXNpdGVkW3hdW3ldPTAp7J246rCS65Ok7J2EIOytie2bkeyWtOyEnCBxdWV1ZeyXkCBwdXNoCiAgMi4g7YGQ6rCAIOu5jOuVjOq5jOyngCBwb3DtlZjrqbTshJwg7IOB7ZWY7KKM7Jqw6rCS7J20IDDsnbTrqbQgMeuhnCDrsJTqv4DsmIjsoJUgLTHsnbTrqbQg6re464OlIOuEmOyWtOqwkCAKICAzLiDrqqjrkZAgcG9w7ZaI7J2E65WMIOy1nOyGjOuCoCDtlZjro6grKyAvIChwb3DtlaDrlYwgdmlzaXRlZFt4XVt5XT0xIO2VtOykhOqygykKICAKICAxLDIsM+ydhCDqs4Tsho0g67CY67O17ZWc7ZuEIG1hdHJpeOqwgCDrqqjrkZAgMeydtOuptCDstZzshozrgqAg7Lac66ClCiAg6re8642wIOyggOyepeuQoOuVjOu2gO2EsCDrqqjrk6Ag7Yag66eI7Yag6rCAIOydteyWtOyeiOuKlCDsg4Htg6Dsp4Ag66qo65GQIOydteyngCDrqrvtlZjripQg7IOB7YOg7KeAIO2MkOuLqO2VmOuKlOqyjCDqs6Drr7zsnbTrhKQKICAKKi8=