#include <bits/stdc++.h>
using namespace std;
int n, cnt;
char s[2100][2100], ans[2100][2100];
int tp[2100 << 1];
bitset<2100> a[2100], a1;
unsigned long long b1[2100], b2[2100];
int v1[2100][2100], v2[2100][2100], v3[2100][2100], mp[2100][2100],
    lk[2100][2100];
int num[2100], beg[2100], ed[2100], vis[2100], bel[2100], lm[2100], rm[2100],
    fa[2100], deep[2100];
vector<int> son[2100];
struct node {
  int lb, rb;
  vector<int> vec, lp, rp;
  vector<bitset<2100> > bs;
  friend bool operator<(const node &r1, const node &r2) {
    if (r1.rb - r1.lb == r2.rb - r2.lb) return r1.vec.size() > r2.vec.size();
    return r1.rb - r1.lb < r2.rb - r2.lb;
  };
  void cal() {
    int cnt = 0;
    for (int i = 0; i < vec.size(); i++) {
      tp[++cnt] = beg[vec[i]];
      tp[++cnt] = ed[vec[i]] + 1;
    }
    sort(tp + 1, tp + 1 + cnt);
    cnt = unique(tp + 1, tp + 1 + cnt) - tp - 1;
    for (int i = 1; i < cnt; i++) {
      lp.push_back(tp[i]);
      rp.push_back(tp[i + 1] - 1);
      bs.push_back(a[0]);
      for (int j = 0; j < vec.size(); j++)
        bs[i - 1][vec[j]] =
            !(beg[vec[j]] > tp[i + 1] - 1 || tp[i] > ed[vec[j]]);
    }
  }
} p[2100];
void quit() {
  puts("NO");
  exit(0);
}
int check(int x) {
  for (int i = 1; i <= n; i++)
    if (i != x && deep[i] && bel[x] == bel[i]) {
      int t2 = 0, t3 = 0;
      if (beg[x] > ed[i] || beg[i] > ed[x])
        t2 = num[i], t3 = num[x];
      else {
        if (beg[x] > beg[i]) t2 += beg[x] - beg[i];
        if (ed[i] > ed[x]) t2 += ed[i] - ed[x];
        if (beg[i] > beg[x]) t3 += beg[i] - beg[x];
        if (ed[x] > ed[i]) t3 += ed[x] - ed[i];
      }
      if (t2 != v2[i][x] || t3 != v3[i][x]) return 0;
    }
  return 1;
}
void dfs(int x, int y, int org) {
  deep[x] = deep[y] + 1;
  bel[x] = org;
  if (!y) {
    beg[x] = 1;
    ed[x] = num[x];
    p[bel[x]].lb = beg[x];
    p[bel[x]].rb = ed[x];
  } else {
    bel[x] = bel[y];
    beg[x] = beg[y] + v2[y][x];
    ed[x] = beg[x] + num[x] - 1;
    if (!check(x)) {
      beg[x] = beg[y] - v3[y][x];
      ed[x] = beg[x] + num[x] - 1;
      if (!check(x)) quit();
    }
    p[bel[x]].lb = min(p[bel[x]].lb, beg[x]);
    p[bel[x]].rb = max(p[bel[x]].rb, ed[x]);
  }
  for (int i = 1; i <= n; i++)
    if (mp[x][i] && !deep[i]) dfs(i, x, org);
  p[bel[x]].vec.push_back(x);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
  n++;
  for (int i = 1; i <= n; i++) s[n][i] = '1';
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) a[i][j] = (s[i][j] == '1');
    num[i] = a[i].count();
    for (int j = 1; j <= n; j++) b1[i] = b1[i] * 10007 + (s[j][i] == '1');
  }
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      a1 = a[i] & a[j];
      v1[i][j] = v1[j][i] = a1.count();
      v2[i][j] = v3[j][i] = num[i] - v1[i][j];
      v3[i][j] = v2[j][i] = num[j] - v1[i][j];
      if (v2[i][j] && v3[i][j] && v1[i][j]) mp[i][j] = mp[j][i] = 1;
    }
  for (int i = 1; i <= n; i++)
    if (!bel[i] && num[i]) dfs(i, 0, ++cnt);
  sort(p + 1, p + 1 + cnt);
  for (int i = 1; i <= cnt; i++)
    for (int j = 0; j < p[i].vec.size(); j++) bel[p[i].vec[j]] = i;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (v1[i][j]) lk[bel[i]][bel[j]] = 1;
  for (int i = 1; i <= cnt; i++) {
    for (int j = i + 1; j <= cnt; j++)
      if (lk[i][j]) {
        fa[i] = j;
        break;
      }
  }
  for (int i = cnt; i >= 1; i--) {
    if (fa[i]) {
      int t = p[i].vec[0], l1 = p[fa[i]].lb, r1 = p[fa[i]].rb;
      a1.reset();
      for (int j = 0, t1; j < p[fa[i]].vec.size(); j++) {
        t1 = p[fa[i]].vec[j];
        a1[t1] = (v1[t][t1] ? 1 : 0);
      }
      if (l1 > r1) quit();
      for (int j = 0; j < p[fa[i]].lp.size(); j++)
        if (p[fa[i]].bs[j] == a1) {
          int l2 = p[fa[i]].lp[j], r2 = p[fa[i]].rp[j];
          if (l2 > r2) continue;
          if (r2 - l2 + 1 < p[i].rb - p[i].lb + 1) continue;
          int det = l2 - p[i].lb;
          for (int k = 0, t; k < p[i].vec.size(); k++) {
            t = p[i].vec[k];
            beg[t] += det;
            ed[t] += det;
          }
          p[i].lb += det;
          p[i].rb += det;
          p[fa[i]].lp[j] += p[i].rb - p[i].lb + 1;
          break;
        }
    }
    p[i].cal();
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) ans[i][j] = '0';
    if (num[i])
      for (int j = beg[i]; j <= ed[i]; j++) ans[i][j] = '1';
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) b2[i] = b2[i] * 10007 + (ans[j][i] == '1');
    int flag = 0;
    for (int j = 1; j <= n; j++)
      if (!vis[j] && b2[i] == b1[j]) {
        flag = 1;
        vis[j] = 1;
        break;
      }
    if (!flag) quit();
  }
  puts("YES");
  for (int i = 1; i < n; i++) {
    for (int j = 1; j < n; j++) putchar(ans[i][j]);
    puts("");
  }
  return 0;
}
