#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e2+7;
ll n,m,a[Maxn][Maxn],ans=1e12,sum;
bool vis[Maxn][Maxn],vi[Maxn][Maxn];
inline bool check(ll x,ll y){
return vis[x-1][y]||vis[x][y-1]||vis[x+1][y]||vis[x][y+1];
}
void freap(ll x,ll y){
for(ll i=-1;i<=1;i++)
for(ll j=-1;j<=1;j++){
if(i==j||i==-j) continue;
ll nx=x+i,ny=j+y;
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vi[nx][ny]&&!vis[nx][ny]){
vi[nx][ny]=1;
freap(nx,ny);
}
}
}
inline bool tar(){
memset(vi,0,sizeof vi);
ll ans=0;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++)
if(!vi[i][j]&&!vis[i][j]){
ans++;
vi[i][j]=1;
freap(i,j);
}
return ans==1;
}
void dfs(ll x,ll y,ll step,ll S){
if(S>sum/2) return ;
if(S==sum/2){
if(tar()) ans=min(ans,step);
return ;
}
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(vis[i][j]) continue;
if(!check(i,j)) continue;
vis[i][j]=1;
dfs(i,j,step+1,S+a[i][j]);
vis[i][j]=0;
}
}
}
int main(){
scanf("%lld%lld",&m,&n);
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++)
scanf("%lld",&a[i][j]),sum+=a[i][j];
if(sum%2){
printf("0");
return 0;
}
vis[1][1]=1;
dfs(1,1,1,a[1][1]);
printf("%lld",ans);
return 0;
}