#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=1,ans=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
return f*ans;
}
const int N=1001;
const int L=201;
int dp[N][L][L],val[L][L],n,l,p[N],minn=INT_MAX;
bool judge(int x1,int x2,int x3){
return (x1!=x2)&&(x2!=x3)&&(x1!=x3);
}
int _min(int a,int b){ return a>b?b:a;}
int main(){
l=read();n=read();
for(int i=1;i<=l;i++)
for(int j=1;j<=l;j++) val[i][j]=read();
memset(dp,127/3,sizeof(dp));dp[0][1][2]=0,dp[0][2][1]=0;p[0]=3;
for(int t=1;t<=n;t++){
p[t]=read();
for(int i=1;i<=l;i++){
for(int j=1;j<=l;j++){
/*val[i][p]*/
if(judge(p[t],p[t-1],j)){
dp[t][p[t-1]][j]=_min(dp[t][p[t-1]][j],dp[t-1][i][j]+val[i][p[t]]);
dp[t][j][p[t-1]]=_min(dp[t][p[t-1]][j],dp[t][j][p[t-1]]);
}
/*val[j][p]*/
if(judge(p[t-1],i,p[t])){
dp[t][p[t-1]][i]=_min(dp[t][p[t-1]][i],dp[t-1][i][j]+val[j][p[t]]);
dp[t][i][p[t-1]]=_min(dp[t][p[t-1]][i],dp[t][i][p[t-1]]);
}
/*val[p[t-1]][p]*/
if(judge(i,j,p[t])){
dp[t][i][j]=_min(dp[t][i][j],dp[t-1][i][j]+val[p[t-1]][p[t]]);
dp[t][j][i]=_min(dp[t][j][i],dp[t][i][j]);
}
}
}
}
for(int i=1;i<=l;i++)
for(int j=1;j<=l;j++) {
if(!(i!=j&&i!=p[n]&&j!=p[n])) continue;
minn=min(minn,dp[n][i][j]);
}
printf("%d",minn);
}