#include <bits/stdc++.h>
using namespace std;
template <typename T>
T rd() {
  T nmb = 0;
  int sgn = 0;
  char chr = getchar();
  while (!isdigit(chr)) {
    if (chr == '-') sgn = 1;
    chr = getchar();
  }
  while (isdigit(chr)) {
    nmb = (nmb << 3) + (nmb << 1) + chr - '0';
    chr = getchar();
  }
  return sgn ? -nmb : nmb;
}
template <typename T>
void wt(T nmb) {
  if (nmb > 9) wt(nmb / 10);
  putchar(nmb % 10 + '0');
}
template <typename T>
void cmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
void cmin(T &x, T y) {
  x = x < y ? x : y;
}
void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int N = 70, M = 40, K = 1840;
int m;
int a[M];
int dp[M][N][K], len[M][N][K];
int b[N], d[N];
int g[N][N];
void Init() {
  m = rd<int>();
  for (int i = 1; i <= m; ++i) a[i] = rd<int>();
  sort(a + 1, a + m + 1);
}
void Solve() {
  dp[0][0][0] = 1;
  for (int i = 1; i <= m; ++i)
    for (int j = i; j <= 61; ++j)
      for (int k = i - 1; k <= j - 1; ++k)
        for (int st = k * (k - 1) / 2, dlt = a[i] * (j - k); st + dlt <= 1830;
             ++st)
          if (dp[i - 1][k][st])
            dp[i][j][st + dlt] = 1, len[i][j][st + dlt] = j - k;
  int n;
  for (n = 1; n <= 61; ++n)
    if (dp[m][n][n * (n - 1) / 2]) break;
  if (n == 62) {
    puts("=(");
    exit(0);
  }
  int tmp = 0;
  for (int i = m, j = n, k = n * (n - 1) / 2; i;) {
    int Len = len[i][j][k];
    for (int t = tmp + 1; t <= tmp + Len; ++t) d[t] = a[i];
    tmp += Len;
    j -= Len, k -= Len * a[i], --i;
  }
  sort(d + 1, d + n + 1);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j < i; ++j) g[i][j] = 1;
  for (int i = 1; i <= n; ++i) b[i] = i - 1;
  int Lim = n * (n - 1) / 2;
  while (Lim--) {
    int Flg = 0;
    for (int i = 1; i <= n; ++i) {
      if (d[i] > b[i]) {
        Flg = 1;
        int j = i;
        while (b[j + 1] == b[i]) ++j;
        for (int k = j + 1; k <= n; ++k)
          if (d[k] < b[k]) {
            for (int x = 1; x <= n; ++x)
              if (g[k][x] && g[x][j]) {
                g[k][x] = 0, g[x][k] = 1;
                g[x][j] = 0, g[j][x] = 1;
                ++b[j], --b[k];
                break;
              }
            break;
          }
        break;
      }
    }
    if (!Flg) break;
  }
  for (int i = 1; i <= n; ++i)
    if (d[i] ^ b[i]) {
      puts("=(");
      exit(0);
    }
  printf("%d\n", n);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) printf("%d", g[i][j]);
    puts("");
  }
}
int main() {
  Init();
  Solve();
  return 0;
}
