#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
template <class T>
inline void smin(T &a, T b) {
  if (a > b) a = b;
}
template <class T>
inline void smax(T &a, T b) {
  if (a < b) a = b;
}
int qf, qb, q[11111111];
long long res[555], a[555][555], dst[555][555];
int r[555], first[555];
int main() {
  int N, ii, i, j, nn, u, st;
  scanf("%d", &N);
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++) scanf("%I64d", &dst[i][j]);
  for (i = 0; i < N; i++) {
    scanf("%d", r + i);
    r[i]--;
  }
  nn = 0;
  for (ii = N - 1; ii >= 0; ii--) {
    st = r[ii];
    for (i = 0; i < nn; i++) {
      for (j = 0; j < nn; j++) {
        smin(dst[st][first[j]], dst[st][first[i]] + dst[first[i]][first[j]]);
        smin(dst[first[j]][st], dst[first[j]][first[i]] + dst[first[i]][st]);
      }
    }
    for (i = 0; i < nn; i++)
      for (j = 0; j < nn; j++)
        smin(dst[first[i]][first[j]], dst[first[i]][st] + dst[st][first[j]]);
    first[nn++] = st;
    res[ii] = 0;
    for (i = 0; i < nn; i++)
      for (j = 0; j < nn; j++) res[ii] += dst[first[i]][first[j]];
  }
  for (i = 0; i < N; i++) {
    if (i) printf(" ");
    printf("%I64d", res[i]);
  }
  puts("");
  return 0;
}
