#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,ans;
int dis[105][105];
bool vis[105],pll[105];
int pl[105];
void dfs(int dt,int cost,int visited){
if(cost>ans)return;
if(visited==p){
ans=min(ans,cost+dis[dt][n]);
return;
}
for(int i=1;i<=p;i++){
if(!vis[pl[i]]){
vis[pl[i]]=true;
dfs(pl[i],cost+dis[dt][pl[i]],visited+1);
vis[pl[i]]=false;
}
}
return;
}
signed main(){
memset(pll,false,sizeof pll);
ans=0x3fffffff;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>dis[i][j];
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][k]!=0&&dis[k][j]!=0)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
cin>>p;
bool flag=false;int ol=0;
for(int ik=1;ik<=p;ik++){
int kld;
cin>>kld;
if(pll[kld]){
ol++;
continue;
}
pll[kld]=true;
pl[ik]=kld;
if(kld==1)flag=true;
}
p-=ol;
vis[1]=true;
dfs(1,0,flag);
cout<<ans<<endl;
return 0;
}