#include <bits/stdc++.h>   using namespace std;   int dx[] = {0, 0, 1, -1};   int dy[] = {1, -1, 0, 0};   template <class T>   inline void smin(T &a, T b) {     if (a > b) a = b;   }   template <class T>   inline void smax(T &a, T b) {     if (a < b) a = b;   }   int qf, qb, q[11111111];   long long res[555], a[555][555], dst[555][555];   int r[555], first[555];   int main() {     int N, ii, i, j, nn, u, st;     scanf( %d , &N);     for (i = 0; i < N; i++)       for (j = 0; j < N; j++) scanf( %I64d , &dst[i][j]);     for (i = 0; i < N; i++) {       scanf( %d , r + i);       r[i]--;     }     nn = 0;     for (ii = N - 1; ii >= 0; ii--) {       st = r[ii];       for (i = 0; i < nn; i++) {         for (j = 0; j < nn; j++) {           smin(dst[st][first[j]], dst[st][first[i]] + dst[first[i]][first[j]]);           smin(dst[first[j]][st], dst[first[j]][first[i]] + dst[first[i]][st]);         }       }       for (i = 0; i < nn; i++)         for (j = 0; j < nn; j++)           smin(dst[first[i]][first[j]], dst[first[i]][st] + dst[st][first[j]]);       first[nn++] = st;       res[ii] = 0;       for (i = 0; i < nn; i++)         for (j = 0; j < nn; j++) res[ii] += dst[first[i]][first[j]];     }     for (i = 0; i < N; i++) {       if (i) printf(   );       printf( %I64d , res[i]);     }     puts(  );     return 0;   }   