#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll b[50][50],dp[50][50],maxTable[50],enterTable[50],a[50];
int n,t,flag,maxx,p,ansv,ansi;
bool ifLast(int xx)
{
for(int i=xx+1;i<n+1;i++)
{
if(b[xx][i])return false;
}
return true;
}
void printPath(int xx)
{
if(xx==0)
{
return ;
}
printPath(enterTable[xx]);
cout<<xx<<" ";
return ;
}
int main()
{
cin>>n;
for(int i=1;i<n+1;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
for(int j=1;j<n-i+1;j++)
{
cin>>t;
b[i][j+i]=t;
if(t)
{
dp[j+i][i]=-1;
}
else
{
dp[j][i]=0;
}
}
}
// for(int i=1;i<n+1;i++)
// {
// for(int j=1;j<)
// }
for(int i=1;i<n+1;i++)
{
maxx=0;
flag=0;
for(int j=1;j<i;j++)
{
if(dp[i][j]==-1)flag=1;
}
if(!flag)
{
for(int k=0;k<i;k++)
{
int temp;
temp=dp[i][k]+a[i];
if(temp>maxx)
{
maxx=temp;
p=k;
}
}
maxTable[i]=maxx;
enterTable[i]=p;
for(int x=1;x<n+1;x++)
{
if(dp[x][i]==-1)dp[x][i]=maxx;
}
}
}
for(int i=1;i<n+1;i++)
{
if(ifLast(i))
{
if(maxTable[i]>ansv)
{
ansv=maxTable[i];
ansi=i;
}
}
}
printPath(ansi);
cout<<endl;
cout<<ansv;
// cout<<endl;
// for(int i=1;i<=n;i++)cout<<maxTable[i]<<" ";
return 0;
}