#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 21
using namespace std;
int read(){
int x=0,f=1; char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+ch^48;
ch=getchar();
}
return x*f;
}
//从后先前进行dp,边界问题就是f[n]=w[n]; f[i]=max(f[i]+w[i])
int n,map[maxn][maxn],d[maxn],f[maxn],w[maxn];
int main()
{
n=read();
int js=1;
for(int i=1;i<=n;i++) w[i]=read();
for(int i=1;i<=n-1;i++){
js=i;
for(int j=n-1;j>=i;j--){
js++; map[i][js]=read();
}
}
f[n]=w[n];
int maxx=0;
for(register int i=n-1;i>=1;i--){
maxx=0; int route=0;
for(register int j=1;j<=n;j++){
if(maxx<f[j]&&map[i][j]==1){
maxx=f[j]; route=j;
}
}
f[i]=w[i]+maxx; d[i]=route;
}
maxx=0;
int begin=0;
for(register int i=1;i<=n;i++){
if(maxx<f[i]){
maxx=f[i];
begin=i;
}
}
cout<<begin;
while(d[begin]!=0){
cout<<d[begin];
begin=d[begin];
}
cout<<endl<<maxx;
return 0;
}