#include<cstdio>
#include<cstring>
#include<iostream>
#define EF if(ch==EOF) return x;
using namespace std;
const int N=12;
int n,g[N][N],f[1<<N][N][N];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;EF;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
//f[S][i][j]已经走过S集合中的点(0-9),当前在(i,j)的最小花费
void dp(){
memset(f,0x3f,sizeof f);
f[1<<g[1][1]][1][1]=g[1][1];
for(int S=1;S<(1<<10);S++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(S&(1<<g[i][j]))
f[S|(1<<g[i+1][j])][i+1][j]=min(f[S|(1<<g[i+1][j])][i+1][j],f[S][i][j]+g[i+1][j]),
f[S|(1<<g[i][j+1])][i][j+1]=min(f[S|(1<<g[i][j+1])][i][j+1],f[S][i][j]+g[i][j+1]);
}
}
}
printf("%d\n",f[(1<<10)-1][n][n]);
}
int main(){
n=10;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=read();
}
}
dp();
return 0;
}