#include <bits/stdc++.h>
using namespace std;
const int maxn = 300 + 10;
set<int> st[maxn];
string a[maxn];
int p[maxn];
int f[maxn];
bool mark[maxn];
int n;
void dfs(int v, int num) {
  mark[v] = true;
  st[v].insert(num);
  for (int i = 0; i < n; i++)
    if (a[v][i] == '1') {
      if (!mark[i]) dfs(i, num);
    }
}
void dfs_all() {
  for (int i = 0; i < n; i++) {
    fill(mark, mark + maxn, false);
    dfs(i, p[i]);
  }
}
void input() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> p[i];
  for (int i = 0; i < n; i++) cin >> a[i];
}
void print() {
  fill(mark, mark + maxn, false);
  for (int i = 0; i < n; i++)
    for (set<int>::iterator it = st[i].begin(); it != st[i].end(); it++)
      if (!mark[*it]) {
        mark[*it] = true;
        cout << *it << " ";
        break;
      }
  cout << endl;
}
int main() {
  input();
  dfs_all();
  print();
  return 0;
}
