/* 又加入一个水题,没有一点突破,简单题就是这样,转转又转回来了,本质上还是水题一个,没什么意思。但是我的代码确实写得没动脑筋,还是那个全排列的模板,想都没想直接套,然后就过了,以后写这样的水题,私下里还是要改进一下代码比较好 */
#include < iostream >
#include < map >
#include < cstdio >
#define N 31
#define inf 0x3f3f3f3f
using namespace std;
bool v[N];
map< int , int > m;
map<int,int>::iterator it;
int a[N][N],n,b[N],w[N],b1,s;
int Min(int x , int y) {return x<y?x:y;}
void check()
{
int i,temp;
for(temp=0,i=1 ; i<b1 ; i++)
temp+=a[w[i-1]][w[i]];
s=Min(s , temp);
}
void dist(int k)
{
int i;
if(k>=b1)
{
w[0]=0;
check();
return ;
}
for(i=1 ; i<b1 ; i++)
{
if(!v[i])
{
v[i]=1;
w[k]=b[i];
dist(k+1);
v[i]=0;
}
}
}
int main ()
{
//freopen("t.txt","r",stdin);
int i,j,k,t;
while(~scanf("%d",&n),n)
{
m.clear();
for(i=0 ; i<n ; i++)
for(j=0 ; j<n ; j++)
scanf("%d",&a[i][j]);
scanf("%d",&t);
for(i=0 ; i<t ; i++)
scanf("%d",&k),m[k]=1;
b[0] = 0;
memset(v,0,sizeof(v));
for(b1=1,it=m.begin();it!=m.end();it++)
if(it->second==1)b[b1++]=it->first;
/*for(i=1 ; i<b1 ; i++) cout<<b[i]<<' ';
cout<<endl;*/
s=inf;
dist(1);
printf("%d\n",s);
}
return 0;
}