#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
int n, w;
int cage[205][205], ques[1005];
int dp[1005][205][205];
inline int min(int x, int y)
{
return x<y?x:y;
}
int dfs(int i, int u1, int u2)
{
if (dp[i][u1][u2]!=-1)
{
return dp[i][u1][u2];
}
if (i==w+1)
{
return dp[i][u1][u2]=0;
}
int last = ques[i-1];
if (last==ques[i])
{
return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, u1, u2);
}
if (u1==ques[i])
{
return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, last, u2);
}
if (u2==ques[i])
{
return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, u1, last);
}
return dp[i][u1][u2]=dp[i][u2][u1]=min(dfs(i+1, u1, u2)+cage[last][ques[i]], min(dfs(i+1, last, u2)+cage[u1][ques[i]], dfs(i+1, u1, last)+cage[u2][ques[i]]));
}
void print(int i, int u1, int u2, int n1, int n2)
{
if (i==w+1)
{
return ;
}
int last = ques[i-1];
if (last==ques[i])
{
cout<<6-n1-n2<<" ";
print(i+1, u1, u2, n1, n2);
return ;
}
if (u1==ques[i])
{
cout<<n1<<" ";
print(i+1, last, u2, 6-n1-n2, n2);
return ;
}
if (u2==ques[i])
{
cout<<n2<<" ";
print(i+1, u1, last, n1, 6-n1-n2);
return ;
}
if (dfs(i+1, u1, u2)+cage[last][ques[i]]<min(dfs(i+1, last, u2)+cage[u1][ques[i]], dfs(i+1, u1, last)+cage[u2][ques[i]]))
{
cout<<6-n1-n2<<" ";
print(i+1, u1, u2, n1, n2);
}
else
{
if (dfs(i+1, last, u2)+cage[u1][ques[i]]<dfs(i+1, u1, last)+cage[u2][ques[i]])
{
cout<<n1<<" ";
print(i+1, last, u2, 6-n1-n2, n2);
}
else
{
cout<<n2<<" ";
print(i+1, u1, last, n1, 6-n1-n2);
}
}
}
int main()
{
memset(dp, -1, sizeof(dp));
cin>>n>>w;
for (int p=1;p<=n;p++)
{
for (int k=1;k<=n;k++)
{
scanf("%d", &cage[p][k]);
}
}
ques[0] = 1;
for (int p=1;p<=w;p++)
{
scanf("%d", &ques[p]);
}
cout<<dfs(1, 2, 3)<<"\n";
print(1, 2, 3, 2, 3);
return 0;
}