#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505, INF = 0x3f3f3f3f;
int n, w[MAXN][MAXN], dis[MAXN][MAXN], op[MAXN];
long long ans[MAXN];
bool vis[MAXN];
void Init() {
  scanf("%d", &n);
  int i, j;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++) scanf("%d", &w[i][j]);
  for (i = 1; i <= n; i++) scanf("%d", op + i);
  reverse(op + 1, op + n + 1);
}
void Work() {
  int i, j, k, x;
  memcpy(dis, w, sizeof(dis));
  for (k = 1; k <= n; k++) {
    x = op[k];
    for (i = 1; i <= n; i++)
      for (j = 1; j <= n; j++)
        dis[i][j] = min(dis[i][j], dis[i][x] + dis[x][j]);
    vis[x] = true;
    for (i = 1; i <= n; i++)
      if (vis[i])
        for (j = 1; j <= n; j++)
          if (vis[j]) ans[k] += dis[i][j];
  }
}
void Output() {
  reverse(ans + 1, ans + n + 1);
  for (int i = 1; i <= n; i++) printf("%I64d ", ans[i]);
}
int main() {
  Init();
  Work();
  Output();
  return 0;
}
