/*从要删除最后一个到第一个进行松弛操作,
因为如果从第一个到最后一个进行松弛操作,弟24行有可能不会更新,若要更新,就需要再一次对d[N][N]初始化
*/
1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 typedef long long ll;
5 #define N 505
6 //const int inf=1<<30;
7 ll d[N][N],dis[N];
8 int del[N];
9 bool v[N];
10 int main(){
11 int n,i,j,l;
12 scanf("%d",&n);
13 for(int i=0;i<n;i++){
14 for(int j=0;j<n;j++){
15 cin>>d[i][j];
16 }
17 }
18 for(i=0;i<n;i++){cin>>del[i];del[i]-=1;}
19 for(i=n-1;i>=0;i--){
20 v[del[i]]=1;
21 ll k=0;
22 for(j=0;j<n;j++){
23 for(l=0;l<n;l++){
24 d[j][l]=min(d[j][l],d[j][del[i]]+d[del[i]][l]);
25 }
26 }
27 for(j=0;j<n;j++){
28 for(l=0;l<n;l++){
29 if(v[l]&&v[j]){
30 k+=d[j][l];
31 }
32 }
33 }
34 dis[i]=k;
35 }
36 for(i=0;i<n-1;i++)cout<<dis[i]<<" ";
37 cout<<dis[n-1]<<endl;
38 return 0;
39 }