#include <bits/stdc++.h>
using namespace std;
vector<int>mp[100004];
int num[100004];
int vis[100004];
vector<int>anspx;
int nu = 0,ans = 0;
int cnt = 0;
vector<int>rec;//
void dfs(int node)
{
int len = mp[node].size();
for(int i = 0; i < len; i++){
if(!vis[node]){
vis[node] = 1;
nu += num[node];
rec.push_back(node); //rec[cnt++] = node;
cnt++;
//怎么判断到底了
if(nu > ans){
vector<int>anspx;
ans = nu;
for(int i = 0; i < cnt; i++) anspx.push_back(rec[i]);
}//ans = max(ans,nu);
int nex = mp[node][i];
dfs(nex);
nu -= num[node];
cnt--; rec.pop_back();
vis[node] = 0;
}
}
}
int main()
{
int n; cin >> n;
for(int i = 1; i <= n; i++) scanf("%d",&num[i]);
for(int k = 1; k <= n-1; k++){ //地窖号
for(int i = k+1; i <= n; i++){ //
int pd;
scanf("%d",&pd);
if(pd){
mp[k].push_back(i);
//mp[i].push_back(k);
}
}
}
for(int i = 1; i <= n; i++){
nu += num[i];
vis[i] = 1;
dfs(i);
vis[i] = 0;
nu = 0;
vector<int>rec;
cnt = 0;
}
for(int i = 0; i < anspx.size(); i++) cout << anspx[i] << " ";
cout << endl << ans <<endl;
}