#include <bits/stdc++.h>
using namespace std;
int n;
int v[520];
long long int dist[520][520];
vector<long long int> res;
int main() {
  scanf("%d", &n);
  for (int i = 0; i < (n); i++) {
    for (int j = 0; j < (n); j++) {
      cin >> dist[i][j];
    }
  }
  for (int i = 0; i < (n); i++) {
    scanf("%d", &v[i]);
    v[i]--;
  }
  for (int i = 0; i < (n); i++) {
    int u = v[n - 1 - i];
    for (int k = 0; k < i; k++) {
      int y = v[n - 1 - k];
      for (int j = 0; j < i; j++) {
        int x = v[n - 1 - j];
        if (dist[u][x] > dist[u][y] + dist[y][x])
          dist[u][x] = dist[u][y] + dist[y][x];
        if (dist[x][u] > dist[x][y] + dist[y][u])
          dist[x][u] = dist[x][y] + dist[y][u];
      }
    }
    for (int j = 0; j < i; j++) {
      int x = v[n - 1 - j];
      for (int k = 0; k < i; k++) {
        int y = v[n - 1 - k];
        if (dist[x][y] > dist[x][u] + dist[u][y])
          dist[x][y] = dist[x][u] + dist[u][y];
      }
    }
    long long int soma = 0;
    for (int j = 0; j <= i; j++) {
      for (int k = 0; k <= i; k++) {
        soma += dist[v[n - 1 - j]][v[n - 1 - k]];
      }
    }
    res.push_back(soma);
  }
  reverse(res.begin(), res.end());
  for (int i = 0; i < ((int)res.size()); i++) {
    cout << res[i] << ' ';
  }
  printf("\n");
  return 0;
}
