#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int mines[MAXN];
int graph[MAXN][MAXN];
int maxMines;
int bestOrder[MAXN];
int order[MAXN];
bool vis[MAXN] = {false};
void dfs(int cur, int cnt, int n) {
vis[cur] = true;
order[cnt] = cur;
cnt += mines[cur];
for (int i = 0; i < n; i++) {
if (graph[cur][i] && !vis[i]) {
dfs(i, cnt, n);
}
}
if (cnt > maxMines) {
maxMines = cnt;
for (int i = 0; i <= cnt; i++) {
bestOrder[i] = order[i];
}
}
vis[cur] = false;
cnt -= mines[cur];
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> mines[i];
}
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
cin >> graph[i][j];
}
}
bool vis[MAXN] = {false};
for (int i = 0; i < n; i++) {
dfs(i, 0, n);
}
for (int i = 0; i < n; i++) {
cout << bestOrder[i] + 1 << " ";
}
cout << endl;
cout << maxMines << endl;
return 0;
}