#include <bits/stdc++.h>
#define maxn 105
#define INF 0x3f
using namespace std;
int dis[maxn][maxn], n, p;
int a[maxn], ans = INF;
bool flag[15];
void floyd(int n) {
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]);
}
}
}
}
}
void dfs(int now, int m, int sum) {
if (m == 0) {
ans = min(sum + dis[now][n], ans);
return;
}
for (int i = 1; i <= p; i++) {
if (!flag[i]) {
flag[i] = 1;
dfs(a[i], m - 1, sum + dis[now][a[i]]);
flag[i] = 0;
}
}
}
int main() {
cin >> n;
memset(dis, INF, sizeof(dis));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int w;
cin >> w;
dis[i][j] = min(dis[i][j], w); //处理重边
}
}
cin >> p;
for (int i = 1; i <= p; i++) {
cin >> a[i];
}
floyd(n);
dfs(1, p, 0);
cout << ans << endl;
return 0;
}