//octal 8진수
//hexadecimal 16진수
//decimal 10진수
//binary 2진수
#include <stdio.h>
#define MAXSIZE 1001
int map[MAXSIZE][MAXSIZE] = {};
int m,n;
int day
int v[MAXSIZE] = {};
int queue[MAXSIZE][MAXSIZE] = {};
int arr[MAXSIZE] = {};
int first = -1;
int rear = -1;
void TOMATO() {
for(int i=0; i<=m; i++) {
map[i][0] = -1;
map[i][n+1] = -1;
}
for(int i=0; i<=n; i++) {
map[0][i] = -1;
map[m+1][i] = -1;
}
map[m+1][n+1] = -1;
}
int check() {
int sum= 0;
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
if(map[i][j] == 0) {
if(map[x+1][y] == -1 && map[x-1][y] == -1 && map[x][y+1] == -1 && map[x][y-1] == -1) {
return 1;
}
if(map[i][j] != 1) {
sum++;
}
}
}
}
if(sum == 0) {
return -1;
}
else {
return 0;
}
}
void enque(int d1, int d2) {
queue[++rear][0] = d1;
queue[rear][1]=d2;
}
int deque1() {
return queue[++first][0];
}
int deque2() {
return queue[first][1];
}
void bfs(int a,int b) {
for(int i=1; i<=n; i++) {
if(map[a][i] == 1 && arr[i][1] == 0) {
enque(i);
arr[i][1] = 1;
}
if(map[a][i] == 1 && arr[i][0] == 0) {
enque(i);
arr[i][0] = 1;
}
}
while(first != rear) {
int x = deque1();
int y = deque2();
for(int i=1; i<=n; i++) {
if(map[a][i] == 1 && arr[i][1] ==0) {
enque(i);
arr[i][0] = 1;
map[a][i] = 1;
}
if(map[i][b] == 1 && arr[i][0] ==0) {
enque(i);
arr[i][0] = 1;
map[i][b] = 1;
}
}
}
}
int main() {
int i,j;
scanf("%d %d", &m, &n);
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
scanf("%d", &map[i][j]);
}
}
TOMATO();
if(check() == 1) {
printf("-1");
return 0;
}
if(check() == -1) {
printf("0");
return 0;
}
// for(i=0; i<=m+1; i++) {
// for(j=0; j<=n+1; j++) {
// printf("%d ", map[i][j]);
// }
// printf("\n");
// }
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
if(map[i][j] == 1) {
bfs(i,j);
}
}
}
return 0;
}