#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e16;
int m,n;
ll sum;
ll ans = inf;
bool st[15][15];
ll g[15][15];
int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0};
bool st1[15][15];
void dfs1(int x,int y)
{
st1[x][y] = true;
for(int i=0;i<4;i++)
{
int xi = x+dx[i],yi = y+dy[i];
if(xi<1 || xi>n || yi<1 || yi>m) continue;
if(!st1[xi][yi] && !st[xi][yi]) dfs1(xi,yi);
}
}
//判断是否分成两个联通块
bool check()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) st1[i][j] = false;
}
int cnt = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(st[i][j] || st1[i][j]) continue;
if(cnt) return false;
dfs1(i,j);
cnt++;
}
}
if(!cnt) return false;
return true;
}
void dfs(int x,int y,ll d,ll tmp)
{
st[x][y] = true;
if(sum - tmp == tmp && check())
{
ans = min(ans,d);
// st[x][y] = false;
return;
}
for(int i=0;i<4;i++)
{
int xi = x+dx[i],yi = y+dy[i];
if(xi<1 || xi>n || yi<1 || yi>m) continue;
if(!st[xi][yi])
{
if(tmp+g[xi][yi]>sum/2) continue;
dfs(xi,yi,d+1,tmp+g[xi][yi]);
}
}
st[x][y] = false;
return ;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%lld",&g[i][j]);
sum += g[i][j];
}
}
dfs(1,1,1,g[1][1]);
if(ans==inf) printf("0");
else printf("%lld",ans);
}