#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace wxh666{
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define sqrt(a) __builtin_sqrt(a)
#define f(a,b,c) for(int a=b;a<=c;a++)
#define ff(a,b,c) for(int a=b;a>=c;a--)
template<typename T>
inline void read(T &ans)
{
char ch=getchar();int f=1;ans=0;
for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
ans*=f;
return;
}
template<typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
inline int read()
{
char ch=getchar();int f=1,ans=0;
for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
return f*ans;
}
#define in read()
template<typename T>
inline void pu(T x)
{
ios::sync_with_stdio(false);
cout<<x;
ios::sync_with_stdio(true);
return;
}
template<typename T>
inline void pk(T x)
{
ios::sync_with_stdio(false);
cout<<x<<" ";
ios::sync_with_stdio(true);
return;
}
inline void pk(char x)
{
ios::sync_with_stdio(false);
cout<<x;
if(x!='\n') cout<<' ';
ios::sync_with_stdio(true);
return;
}
template<typename T,typename ...Args>
inline void pu(T x,Args ...xs){pu(x);pu(xs...);}
template<typename T,typename ...Args>
inline void ppu(T x,Args ...xs){pu(x,xs...,'\n');}
template<typename T,typename ...Args>
inline void pk(T x,Args ...xs){pk(x);pk(xs...);}
template<typename T,typename ...Args>
inline void ppk(T x,Args ...xs){pk(x,xs...,'\n');}
#define cs(dt,n,m) \
for(int i=1;i<=n;i++)\
{\
for(int j=1;j<=n;j++)\
printf("%d ",dt[i][j]);\
cout<<endl;\
}
};using namespace wxh666;
namespace lsq {
typedef int lsqxx;
struct lq {
struct lqbz {
lsqxx v,w,c,nxt;
} e[5000005];
lsqxx h[5000005],cnt=1;
inline void add(lsqxx u,lsqxx v,lsqxx w,lsqxx c) {
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].c=c;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void erase() {cnt=0;memset(h,0,sizeof(h));return;}
#define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w,c=z.e[j].c;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w,c=z.e[j].c)
}q;
};
using namespace lsq;
int n,m,s,t,ce,all;
int dt[2005][2005];
int x;
int bcnt;
inline int two_one(int x,int y,int f)
{
return f*ce+(x-1)*m+y;
}
inline void adds(int u,int v,int w,int c,int z_f)
{
if(z_f) q.add(u,v,w,c),q.add(v,u,0,-c);
if(!z_f) q.add(v,u,w,c),q.add(u,v,0,-c);
}
int dis[2005],incf[2005],pre[2005];
bool spfa()
{
int vis[2005]={0};
memset(dis,0x3f,sizeof(dis));
queue<int>p;
p.push(s);
dis[s]=0;
vis[s]=1;
incf[s]=1<<30;
while(!p.empty())
{
int u=p.front();p.pop();vis[u]=0;
F(q,u)
{
if(!w) continue;
if(dis[v]<=dis[u]+c) continue;
dis[v]=dis[u]+c;
incf[v]=min(incf[u],w);
pre[v]=j;
if(vis[v]) continue;
vis[v]=1,p.push(v);
}
}
if(dis[t]==0x3f3f3f3f3f3f3f3f) return false;
else return true;
}
void EK()
{
int ans,cans;
ans=cans=0;
while(spfa())
{
ans+=incf[t];
cans+=dis[t]*incf[t];
int now=t;
int k;
while(now!=s)
{
k=pre[now];
q.e[k].w-=incf[t];
q.e[k^1].w+=incf[t];
now=q.e[k^1].v;
}
}
if(ans!=bcnt/2)
puts("-1");
else
ppk(cans);
}
signed main()
{
cin>>n>>m;s=0;t=n*m*5+1;all=t+1;ce=n*m;
f(i,1,n) f(j,1,m)
{
scanf("%lld",&x);
if((i+j)&1) q.add(s,two_one(i,j,0),INT_MAX,0),
q.add(two_one(i,j,0),s,0,0);
else q.add(two_one(i,j,0),t,INT_MAX,0),
q.add(t,two_one(i,j,0),0,0);
if((i+j)&1)
{
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
f(k,1,4)
{
int xx=i+dx[k],yy=j+dy[k];
if(xx<1||yy<1||xx>n||yy>m) continue;
int tos=(k+2);if(tos>=5) tos=tos%5+1;
q.add(two_one(i,j,k),two_one(xx,yy,tos),1,0);
q.add(two_one(xx,yy,tos),two_one(i,j,k),0,0);
}
}
switch(x)
{
case 1:bcnt++;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,2),1,1,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,3),1,2,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,4),1,1,(i+j)&1);
break;
case 2:bcnt++;
adds(two_one(i,j,2),two_one(i,j,1),1,1,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,3),1,1,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,4),1,2,(i+j)&1);
break;
case 4:bcnt++;
adds(two_one(i,j,3),two_one(i,j,1),1,2,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,2),1,1,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,4),1,1,(i+j)&1);
break;
case 8:bcnt++;
adds(two_one(i,j,4),two_one(i,j,1),1,1,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,2),1,2,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,3),1,1,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
break;
case 3:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,3),1,1,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,4),1,1,(i+j)&1);
break;
case 6:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,1),1,1,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,4),1,1,(i+j)&1);
break;
case 9:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,2),1,1,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,3),1,1,(i+j)&1);
break;
case 12:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,2),1,1,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,1),1,1,(i+j)&1);
break;
case 5:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
break;
case 10:bcnt+=2;
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
break;
case 7:bcnt+=3;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,4),1,1,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,4),1,2,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,4),1,1,(i+j)&1);
break;
case 11:bcnt+=3;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,3),1,2,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,3),1,1,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,3),1,1,(i+j)&1);
break;
case 13:bcnt+=3;
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,2),1,2,(i+j)&1);
adds(two_one(i,j,1),two_one(i,j,2),1,1,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,2),1,1,(i+j)&1);
break;
case 14:bcnt+=3;
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,2),two_one(i,j,1),1,1,(i+j)&1);
adds(two_one(i,j,3),two_one(i,j,1),1,2,(i+j)&1);
adds(two_one(i,j,4),two_one(i,j,1),1,1,(i+j)&1);
break;
case 15:bcnt+=4;
adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
break;
}
}
EK();
return 0;
}