#include <bits/stdc++.h>
using namespace std;
const int L=310;
const int N=3005;
int q[N],dp[2][L][L],cost[L][L];
int X[N],Y[N];
unsigned char c[N][L][L];
int t,n,l;
inline void solve()
{
int t=0;
for(int i=0;i<n;i++)
{
memset(dp[t^1],0x3f,sizeof(dp[t^1]));
for(int j=1;j<=l;j++)
{
for(int k=1;k<=l;k++)
{
if(j==k||j==q[i]||k==q[i]) continue;
if(q[i]!=j&&q[i]!=q[i+1])
{
int sum=dp[t][j][k]+cost[k][q[i+1]];
if(dp[t^1][j][q[i]]>sum)
{
dp[t^1][j][q[i]]=sum;
c[i+1][j][q[i]]=k;
}
}
if(q[i+1]!=k&&q[i]!=q[i+1])
{
int sum=dp[t][j][k]+cost[j][q[i+1]];
if(dp[t^1][q[i]][k]>sum)
{
dp[t^1][q[i]][k]=sum;
c[i+1][q[i]][k]=j;
}
}
if(q[i+1]!=j&&q[i+1]!=k)
{
int sum=dp[t][j][k]+cost[q[i]][q[i+1]];
if(dp[t^1][j][k]>sum)
{
dp[t^1][j][k]=sum;
c[i+1][j][k]=0;
}
}
}
}
t=t^1;
}
int ans=0x3f3f3f3f;
int cntj=0,cntk=0;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
if(ans>dp[t][i][j])
{
ans=dp[t][i][j];
cntj=i;
cntk=j;
}
}
}
cout<<ans<<endl;
X[0]=1;Y[0]=2;
for(int i=n;i>=1;i--)
{
int temp=c[i][cntj][cntk];
X[i]=cntj;Y[i]=cntk;
if(temp!=0)
{
if(cntj==q[i-1])
{
cntj=temp;
}
if(cntk==q[i-1])
{
cntk=temp;
}
}
}
int A=1,B=2;
for(int i=1;i<=n;i++)
{
if(X[i]==q[i-1])
{
A=6-A-B;
}
if(Y[i]==q[i-1])
{
B=6-A-B;
}
cout<<6-A-B<<" ";
}
}
int main()
{
q[0]=3;
memset(dp,0x3f,sizeof(dp));
dp[0][1][2]=0;
cin>>l>>n;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
cin>>cost[i][j];
}
}
for(int i=1;i<=n;i++)
{
cin>>q[i];
}
solve();
return 0;
}