#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<iostream>
#include<string>
#include<cmath>
#define MaxL 5001000
#define N 2100100
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
int q[MaxL+1000],n,m,tot;bool inq[N];
int pre[4*N],w[4*N],dis[N],last[N],len=0,e[4*N];
int r1[1010][1010],r2[1010][1010],r3[1010][1010];
int g1(int x,int y)
{
return (x-1)*(m-1)+y;
}
int g2(int x,int y)
{
return (x-1)*(m-1)+y+tot;
}
void Add(int x,int y,int z)
{
pre[++len]=last[x];last[x]=len;e[len]=y;w[len]=z;
}
void adddd(int x,int y,int z)
{
Add(x,y,z);Add(y,x,z);
}
int Nxt(int x)
{
if (x==MaxL-1) return 1;
return x+1;
}
void SPFA(int v0)
{
int i;
FOR(i,1,tot+tot+100) dis[i]=2e9;
dis[v0]=0;
int h=0,t=1;
memset(inq,0,sizeof(inq));
inq[v0]=1;q[1]=v0;
while (h!=t)
{
h=Nxt(h);int u=q[h];
for(int p=last[u];p;p=pre[p])
{
int v=e[p],W=w[p];
if (dis[u]+W<dis[v])
{
dis[v]=dis[u]+W;
if (!inq[v])
{
t=Nxt(t);
q[t]=v;
inq[v]=1;
}
}
}
inq[u]=0;
}
}
void Main()
{
int i,j;
FOR(i,1,n)
FOR(j,1,m-1) scanf("%d",&r1[i][j]);
FOR(i,1,n-1) FOR(j,1,m) scanf("%d",&r2[i][j]);
FOR(i,1,n-1) FOR(j,1,m-1) scanf("%d",&r3[i][j]);
if (n==1)
{
int Min=1e9;
FOR(j,1,m-1)
if (r1[1][j]<Min) Min=r1[1][j];
printf("%d\n",Min);return;
}
if (m==1)
{
int Min=1e9;
FOR(j,1,n-1)
if (r2[j][1]<Min) Min=r2[j][1];
printf("%d\n",Min);return;
}
tot=(n-1)*(m-1);
int ns=2*tot+1,nt=2*tot+2;
FOR(i,1,n-1) FOR(j,1,m-1)
{
if (j==1) Add(ns,g1(i,j),r2[i][1]);
if (i==n-1) Add(ns,g1(i,j),r1[n][j]);
if (i==1) Add(g2(i,j),nt,r1[1][j]);
if (j==m-1) Add(g2(i,j),nt,r2[i][m]);
Add(g1(i,j),g2(i,j),r3[i][j]);
if (j<m-1) Add(g2(i,j),g1(i,j+1),r2[i][j+1]);
if (i>1) Add(g2(i,j),g1(i-1,j),r1[i][j]);
}
SPFA(ns);
printf("%d\n",dis[nt]);
}
int main()
{
freopen("mk3.in","r",stdin);
freopen("mk3.out","w",stdout);
while (scanf("%d%d",&n,&m)!=EOF) Main();
}