#include<stdio.h>
const int maxn=25;
int a[maxn],b[maxn],cmp[maxn],u[maxn],f[maxn][maxn],n,maxlen,ans;
void dfs(int m,int s,int len){
if(cmp[m]==0 || m==n+1){
if(s>ans){
ans=s;
maxlen=len;
int x=0;
for(int i=1;i<=n;i++){
if(u[i]){
b[++x]=i;
}
}
b[len]=m;
}
}else{
for(int i=m+1;i<=n;i++){
if(u[i] || f[m][i]==0 || (len>maxlen && s+a[i]<=ans)) continue;
u[m]=1;
dfs(i,s+a[i],len+1);
u[m]=0;
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
scanf("%d",&f[i][j]);
cmp[i]+=f[i][j];
}
}
for(int i=0;i<=n;i++){
if(cmp[i]){
dfs(i,a[i],1);
}
}
for(int i=1;i<=maxlen;i++){
printf("%d ",b[i]);
}
printf("\n%d",ans);
return 0;
}