#include <bits/stdc++.h>
using namespace std;
const int N = 70;
int dp[35][N][2500];
int sum[N];
int a[N], b[N], c[N];
int tot;
int p[N][N];
struct data {
  int w, id;
  data() {}
  data(int w, int id) : w(w), id(id) {}
  friend bool operator<(data aa, data bb) { return aa.w < bb.w; }
};
priority_queue<data> q;
data cur[N];
void dfs(int n, int i, int s) {
  int j;
  for (j = 1; j <= i; j++) {
    b[++tot] = a[n];
    if (dp[n - 1][i - j][s - a[n] * j]) {
      dfs(n - 1, i - j, s - a[n] * j);
      return;
    }
  }
}
int main() {
  int i, j, k, l;
  int n;
  int flag = 0;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  sort(a + 1, a + 1 + n);
  for (i = 1; i <= 65; i++) sum[i] = sum[i - 1] + i - 1;
  dp[0][0][0] = 1;
  for (i = 1; i <= n; i++) {
    for (j = 0; j <= 61; j++) {
      for (k = 0; k <= a[i - 1] * j; k++) {
        if (!dp[i - 1][j][k]) continue;
        for (l = 1; l <= 61; l++) {
          if (k + a[i] * l >= sum[j + l]) {
            dp[i][j + l][k + a[i] * l] = 1;
          }
        }
      }
    }
  }
  for (i = 1; i <= 61; i++) {
    if (dp[n][i][sum[i]]) {
      flag = 1;
      dfs(n, i, sum[i]);
      sort(b + 1, b + 1 + tot);
      break;
    }
  }
  if (!flag) {
    printf("=(\n");
    return 0;
  }
  for (i = 1; i <= tot; i++) c[i] = b[i] - (i - 1);
  for (i = 1; i <= tot; i++) {
    for (j = 1; j <= i - 1; j++) {
      p[i][j] = 1;
    }
  }
  j = 1;
  for (i = 1; i <= tot; i++) {
    if (c[i] > 0) q.push(data(c[i], i));
    if (c[i] < 0) {
      for (j = 1; j <= -c[i]; j++) {
        cur[j] = q.top();
        q.pop();
        cur[j].w--;
        p[i][cur[j].id] = 0;
        p[cur[j].id][i] = 1;
      }
      for (j = 1; j <= -c[i]; j++) {
        if (cur[j].w) q.push(cur[j]);
      }
    }
  }
  printf("%d\n", tot);
  for (i = 1; i <= tot; i++) {
    for (j = 1; j <= tot; j++) {
      printf("%d", p[i][j]);
    }
    printf("\n");
  }
}
