#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10, mod = 1e9 + 7;
const long long inf = 1e18;
const int M1 = 33, M2 = 63, M3 = 63 * 33;
pair<bool, bool> dp[M1 + 40][M2 + 40][M3 + 40];
int a[M1], B = -1, C = -1;
int adj[M2][M2];
vector<pair<int, int> > dg;
int main() {
  int m;
  scanf("%d", &m);
  for (int i = 0; i < m; i++) scanf("%d", &a[i]);
  sort(a, a + m);
  dp[0][0][0] = {1, 0};
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < M2; j++) {
      for (int k = (j * (j - 1)) / 2; k < M3; k++) {
        if (dp[i][j][k].first) {
          dp[i + 1][j + 1][k + a[i]] = {1, 1};
          dp[i][j + 1][k + a[i]] = {1, 0};
        }
      }
    }
  }
  for (int j = 0; j < M2; j++) {
    for (int k = 0; k < M3; k++) {
      if (B == -1 && dp[m][j][k].first && j * (j - 1) == 2 * k) B = j, C = k;
    }
  }
  int n = B;
  if (n == -1) {
    printf("=\n");
    return 0;
  }
  for (; B > 0; B--) {
    int D = (dp[m][B][C].second ? a[--m] : a[m]);
    C -= D;
    dg.push_back({D, B - 1});
  }
  while (!dg.empty()) {
    sort(dg.begin(), dg.end());
    for (int j = 1; j < int((dg).size()); j++) {
      if (dg[0].first > 0) {
        adj[dg[0].second][dg[j].second] = 1;
        dg[0].first--;
      } else {
        adj[dg[j].second][dg[0].second] = 1;
        dg[j].first--;
      }
    }
    swap(dg[0], dg[int((dg).size()) - 1]);
    dg.pop_back();
  }
  printf("%d\n", n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) printf("%d", adj[i][j]);
    printf("\n");
  }
  return 0;
}
