#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b) ((a)>(b)?a:b)
#define min(a,b) ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define mid (l+r>>1)
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e6+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){ re int x=0,f=0;re char c=getchar(); while(!isdigit(c)) f|=(c=='-'),c=getchar(); while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return f?-x:x;}
in void write(re int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}
struct edge{
int u,v,w;
int nx;
}e[M];
int tot,head[N];
in void add(re int u,re int v,re int w){
e[++tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].nx=head[u];
head[u]=tot;
}
int start,End;
int k;
int deep[N],dis[N];
bool vis[N];
int n,m;
struct node{
int val,id;
node(int x,int y){
val=y;id=x;
}
bool operator < (const node &a)const{
return val>a.val;
}
};
priority_queue<node>q;
int dij(re int s){
for(re int i=1;i<=End;i++){
dis[i]=INF;
}
dis[s]=0;
q.push(node(s,0));
while(!q.empty()){
re int u=q.top().id;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(re int i=head[u];i;i=e[i].nx){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]){
q.push(node(v,dis[v]));
}
}
}
}
return dis[End];
}
signed main(){
n=read();m=read();
End=(2*n-2)*(m-1)+1;
int w,u,v;
for(re int i=1;i<m;i++){
w=read();
add(i*2,End,w);
}
for(re int i=2;i<n;i++){
for(re int j=1;j<m;j++){
w=read();
u=2*(i-2)*(m-1)-1+2*j;
v=2*(i-1)*(m-1)+2*j;
add(u,v,w);add(v,u,w);
}
for(re int i=1;i<m;i++){
w=read();
v=2*(n-2)*(m-1)-1+2*i;
add(start,v,w);
}
}
for(re int i=1;i<n;i++){
for(re int j=1;j<=m;j++){
w=read();
u=2*(i-1)*(m-1)-1+2*j;
v=u-1;
if(j==1) add(start,u,w);
else if(j==m) add(v,End,w);
else {
add(u,v,w);add(v,u,w);
}
}
}
for(re int i=1;i<n;i++){
for(re int j=1;j<m;j++){
u=2*(i-1)*(m-1)-1+2*j;
v=u+1;
w=read();
add(u,v,w);add(v,u,w);
}
}
cout<<dij(0)<<endl;
return 0;
}