//本题用dp和dfs都行,需要记录路径
#include<bits/stdc++.h>
using namespace std;
int a[205];
int b[205][205];//图 i到j是否连通
int dp[205];//以i结束的最多雷数
int path[205];//记录路径
int pre[205];//pre[i]=j,i的前驱节点是j
int main(){
int N;
cin>>N;
for(int i=1;i<=N;i++){
cin>>a[i];
}
for(int i=1;i<=N;i++){
for(int j=i+1;j<=N;j++){
cin>>b[i][j];
}
}
for(int i=1;i<=N;i++){
dp[i]=a[i];
}
int ans=0,num=0;//ans是记录终点
for(int i=1;i<=N;i++){
for(int j=1;j<i;j++){//由于i的点只能走向i+1,i+2,i+2......
if(b[j][i]&&dp[i]<dp[j]+a[i]){//转移方程
dp[i]=dp[j]+a[i],pre[i]=j;
}
}
if(dp[i]>num)num=dp[i],ans=i;
}
int ant=0;
while(ans){
path[ant++]=ans;
ans=pre[ans];
}
for(int i=ant-1;i>=0;i--){
printf("%d ",path[i]);
}
printf("\n%d\n",num);
}