#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
bool mini(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T1, typename T2>
bool maxi(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int N = 35;
const int S = 2000;
const int oo = 1e9;
int dp[S][N][N << 1][2];
int d[N << 1];
int a[N];
int n, m;
bool ans[N << 1][N << 1];
bool ptr[S][N][N << 1][2];
int solve(int s, int i, int j, bool ok) {
  int &res = dp[s][i][j][ok];
  bool &p = ptr[s][i][j][ok];
  if (i > m) return (s == (j * (j - 1) >> 1)) ? j : oo;
  if (res != -1) return res;
  res = oo;
  if (ok) {
    res = solve(s, i + 1, j, 0);
    p = 0;
  }
  if (s + a[i] >= (j * (j + 1) >> 1))
    if (mini(res, solve(s + a[i], i, j + 1, 1))) p = 1;
  return res;
}
void trace() {
  int cur = 0;
  bool ok = 0;
  for (int i = 1; i <= m;) {
    bool take = ptr[cur][i][n][ok];
    if (take) {
      cur += a[i];
      d[++n] = a[i];
      ok = true;
    } else {
      i++;
      ok = false;
    }
  }
  cout << n << "\n";
  vector<int> id(n, 0);
  iota(id.begin(), id.end(), 1);
  for (int t = 1; t < n; t++) {
    sort(id.begin(), id.end(), [](int i, int j) { return d[i] < d[j]; });
    int u = id.back();
    id.pop_back();
    for (int i = 0; i < d[u]; i++) {
      int v = id[i];
      ans[u][v] = 1;
    }
    for (int i = d[u]; i < (int)id.size(); i++) {
      int v = id[i];
      ans[v][u] = 1;
      d[v]--;
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      cout << ans[i][j];
      if (j == n) cout << "\n";
    }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> m;
  for (int i = 1; i <= m; i++) cin >> a[i];
  sort(a + 1, a + m + 1);
  memset(dp, -1, sizeof(dp));
  if (solve(0, 1, 0, 0) == oo) return cout << "=(", 0;
  trace();
  return 0;
}
