#include <bits/stdc++.h>
using namespace std;
const long long MAX = 1000000000000000000;
long long mod = 1000000000;
long double pi = 3.141592653589793238;
void pls() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
long long n;
long long dis[501][501];
long long ndis[501][501];
vector<long long> ans, ver;
void solve() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> dis[i][j];
    }
  }
  for (int i = 0; i < n; i++) {
    long long x;
    cin >> x;
    x--;
    ver.push_back(x);
  }
  reverse(ver.begin(), ver.end());
  for (int k = 0; k < ver.size(); k++) {
    int u = ver[k];
    long long tot = 0;
    for (int i = 0; i < k; i++) {
      ndis[ver[i]][u] = dis[ver[i]][u];
      ndis[u][ver[i]] = dis[u][ver[i]];
    }
    for (int i = 0; i <= k; i++) {
      for (int j = 0; j <= k; j++) {
        if (ndis[ver[j]][u] > ndis[ver[j]][ver[i]] + ndis[ver[i]][u])
          ndis[ver[j]][u] = ndis[ver[j]][ver[i]] + ndis[ver[i]][u];
      }
    }
    for (int i = 0; i <= k; i++) {
      for (int j = 0; j <= k; j++) {
        if (ndis[u][ver[j]] > ndis[u][ver[i]] + ndis[ver[i]][ver[j]])
          ndis[u][ver[j]] = ndis[u][ver[i]] + ndis[ver[i]][ver[j]];
      }
    }
    for (int i = 0; i <= k; i++) {
      for (int j = 0; j <= k; j++) {
        if (ndis[ver[i]][ver[j]] > ndis[ver[i]][u] + ndis[u][ver[j]])
          ndis[ver[i]][ver[j]] = ndis[ver[i]][u] + ndis[u][ver[j]];
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        tot += ndis[i][j];
      }
    }
    ans.push_back(tot);
  }
  reverse(ans.begin(), ans.end());
  for (auto x : ans) {
    cout << x << " ";
  }
  cout << endl;
}
int main() {
  pls();
  solve();
  return 0;
}
