#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e2 + 17;
const int INF = 0x3f3f3f3f;
int ori[MAXN][MAXN], in[MAXN];
int dis[MAXN], vis[MAXN], td[MAXN][MAXN];
int main(int argc, char const *argv[]) {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i != j) td[i][j] = INF;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> ori[i][j];
    }
  }
  vector<int> ord(n);
  for (int i = 0; i < n; i++) {
    cin >> ord[i];
    ord[i]--;
  }
  vector<long long> as;
  for (int i = 0; i < n; i++) {
    int now = ord[n - i - 1];
    in[now] = 1;
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (!(in[j] && in[k])) continue;
        td[now][k] = min(td[now][k], ori[now][j] + td[j][k]);
        td[k][now] = min(td[k][now], ori[j][now] + td[k][j]);
      }
    }
    for (int j = 0; j < n; j++) {
      ;
      ;
    }
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        td[j][k] = min(td[j][k], td[j][now] + td[now][k]);
        td[k][j] = min(td[k][j], td[k][now] + td[now][j]);
      }
    };
    long long ans = 0;
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (td[j][k] != INF) {
          ;
          ;
          ;
          ans += td[j][k];
        }
      }
    };
    as.push_back(ans);
  }
  reverse(as.begin(), as.end());
  for (auto i : as) cout << i << endl;
  return 0;
}
