#include <bits/stdc++.h>
using namespace std;
const int eps = 0.00000001;
const int maxn = 508;
const int maxm = maxn * maxn * 16;
char g[400][400];
int da[50000];
void floyd(int n) {
  for (int k = (0); k < (n); k++)
    for (int i = (0); i < (n); i++)
      for (int j = (0); j < (n); j++)
        if (g[i][k] == '1' && g[k][j] == '1') g[i][j] = '1';
}
int main() {
  int n, m;
  while (~scanf("%d", &n)) {
    for (int i = 0; i < n; i++) scanf("%d", &da[i]);
    for (int i = 0; i < n; i++) scanf("%s", g[i]);
    floyd(n);
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++)
        if (g[i][j] == '1' && da[j] < da[i]) {
          swap(da[i], da[j]);
        }
    }
    for (int i = 0; i < n; i++) printf("%d%c", da[i], i == n - 1 ? '\n' : ' ');
  }
  return 0;
}
