#include<iostream>
using namespace std;
class graph
{
public:
int vexnum, arcnum;
int vexs[21];
int arcs[21][21];
};
int n,maxx,path[21],cnt,ans[21];
graph G;
bool pos[21];
void CreatUDN(int n,graph& G)
{
for (int i = 1; i <= n; i++)
{
cin >> G.vexs[i];
}
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
cin >> G.arcs[i][j];
}
}
}
bool check(int x)
{
for (int i = 1; i <= n; i++)
{
if (G.arcs[x][i] && !pos[i])return false;
}
return true;
}
void dfs(int x,int step,int sum)
{
if (check(x))
{
if (maxx < sum)
{
maxx = sum;
cnt = step;
for (int i = 1; i <= step; i++)
{
ans[i] = path[i];
}
}
return;
}
else
{
for (int i = 1; i <= n; i++)
{
if (G.arcs[x][i] && !pos[i])
{
pos[i] = true;
path[step + 1] = i;
dfs(i, step + 1, sum + G.vexs[i]);
pos[i] = false;
}
}
}
}
int main()
{
cin >> n;
memset(pos, false, sizeof(pos));
CreatUDN(n, G);
for (int i = 1; i <= n; i++)
{
pos[i] = true;
path[1] = i;
dfs(i, 1, G.vexs[i]);
pos[i] = false;
}
for (int i = 1; i <= cnt; i++)
{
cout << ans[i] << " ";
}
cout << endl;
cout << maxx;
return 0;
}