/*
算法:dfs
#include <iostream>
using namespace std;
const int N = 30;
int n;
int w[N];
int s[N][N];
int a[N], g[N], ans = 0, cnt = 0;
void dfs(int u, int sum, int t)
{
if(sum > ans)
{
ans = sum, cnt = t;
for(int i = 0; i < t; i++)
a[i] = g[i];
}
for(int i = u + 1; i <= n; i++)
{
if(s[u][i])
{
g[t] = i;
dfs(i, sum + w[i], t + 1);
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++) cin >> s[i][j];
}
for(int i = 1; i <= n; i++)
{
g[0] = i;
dfs(i, w[i], 1);
}
for(int i = 0; i < cnt; i++) cout << a[i] << ' ';
cout << endl << ans;
return 0;
}
*/
//算法:dp
// 状态表示:f[i]表示以第i个地窖为终点的最多地雷数
// 状态计算:f[i] = max{f[j]}, j < i
#include <iostream>
using namespace std;
const int N = 30;
int s[N][N], w[N];
int f[N], pre[N];
void dfs(int x)
{
if(x) dfs(pre[x]);
if(x) cout << x << ' ';
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++) cin >> s[i][j];
int ans = 0, pos;
for(int i = 1; i <= n; i++)
{
f[i] = w[i]; //初始化,即该点即是起点也是终点
for(int j = 1; j < i; j++)
if(s[j][i] && f[i] < f[j] + w[i])
{
f[i] = f[j] + w[i];
pre[i] = j; // i的前驱为j
}
if(ans < f[i])
{
ans = f[i];
pos = i; //记录最后一点
}
}
dfs(pos); // 递归求路径
cout << endl;
cout << ans << endl;
return 0;
}