#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:836777216")
using namespace std;
long long a[505][505];
long long b[505][505];
int n;
vector<int> order;
int main(void) {
  scanf("%d", &n);
  for (int(i) = 0; (i) < (n); (i)++) {
    for (int(j) = 0; (j) < (n); (j)++) {
      scanf("%d", &a[i][j]);
    }
  }
  for (int(i) = 0; (i) < (n); (i)++) {
    int x;
    scanf("%d", &x);
    x--;
    order.push_back(x);
  }
  if (n == 1) {
    printf("0\n");
    return 0;
  }
  for (int(i) = (n)-1; (i) >= 0; (i)--) {
    for (int(j) = (n)-1; (j) >= 0; (j)--) {
      b[n - 1 - i][n - 1 - j] = a[order[i]][order[j]];
    }
  }
  vector<long long> ans;
  for (int(k) = 0; (k) < (n); (k)++) {
    for (int(i) = 0; (i) < (n); (i)++) {
      for (int(j) = 0; (j) < (n); (j)++) {
        b[i][j] = min(b[i][j], b[i][k] + b[k][j]);
      }
    }
    long long tmp = 0;
    for (int(i) = 0; (i) < (k + 1); (i)++) {
      for (int(j) = 0; (j) < (k + 1); (j)++) {
        tmp += b[i][j];
      }
    }
    ans.push_back(tmp);
  }
  for (int(i) = ((int)(ans).size()) - 1; (i) >= 0; (i)--) {
    printf("%lld%c", ans[i], " \n"[!i]);
  }
}
