#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int dx8[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy8[] = {1, -1, -1, 0, 1, -1, 0, 1};
int kx8[] = {1, 1, 2, 2, -1, -1, -2, -2};
int ky8[] = {2, -2, 1, -1, 2, -2, 1, -1};
long long bigmod(long long a, long long b, long long c) {
  if (b == 0) return 1 % c;
  long long x = bigmod(a, b / 2, c);
  x = (x * x) % c;
  if (b % 2 == 1) x = (x * a) % c;
  return x;
}
long long mod_inverse(long long a, long long mod) {
  return bigmod(a, mod - 2, mod);
}
long long a[506][505];
long long dp[505][505];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) cin >> a[i][j];
  }
  vector<int> v(n);
  for (int i = 0; i < (n); i++) cin >> v[i];
  reverse(v.begin(), v.end());
  vector<long long> ans;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) dp[i][j] = (i == j) ? 0 : 1e15;
  }
  vector<int> del;
  for (auto x : v) {
    for (int i = 1; i <= n; i++) {
      dp[x][i] = min(dp[x][i], a[x][i]);
      dp[i][x] = min(dp[i][x], a[i][x]);
    }
    del.push_back(x);
    long long sum = 0;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        dp[i][j] = min(dp[i][j], dp[i][x] + dp[x][j]);
      }
    }
    for (auto z : del) {
      for (auto y : del) sum += dp[z][y];
    }
    ans.push_back(sum);
  }
  reverse(ans.begin(), ans.end());
  for (auto x : ans) cout << x << " ";
  cout << endl;
  return 0;
}
