#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define P(A,B) ((A-1)*n+B)
using namespace std;
int n,m,cnt,ans,S,T;
int to[1010000],next[1010000],val[1010000],dis[250010],vis[250010],head[250010];
priority_queue<pair<int,int> > pq;
int rd()
{
int ret=0; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) gc=getchar();
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret;
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{
scanf("%d",&n);
S=0,T=n*n+1;
int i,j,u;
memset(head,-1,sizeof(head));
for(i=1;i<=n+1;i++) for(j=1;j<=n;j++) add((i==1)?S:P(i-1,j),(i>n)?T:P(i,j),rd());
for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) add((j>n)?S:P(i,j),(j==1)?T:P(i,j-1),rd());
for(i=1;i<=n+1;i++) for(j=1;j<=n;j++) add((i>n)?T:P(i,j),(i==1)?S:P(i-1,j),rd());
for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) add((j==1)?T:P(i,j-1),(j>n)?S:P(i,j),rd());
memset(dis,0x3f,sizeof(dis));
pq.push(make_pair(0,S)),dis[S]=0;
while(!pq.empty())
{
u=pq.top().second,pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+val[i])
{
dis[to[i]]=dis[u]+val[i];
pq.push(make_pair(-dis[to[i]],to[i]));
}
}
}
printf("%d",dis[T]);
return 0;
}