#include <bits/stdc++.h>
using namespace std;
int M;
int A[35];
vector<int> cand;
vector<int> V;
int mat[65][65];
int did[32][65][3500];
void hoge(int id, int num, int sum) {
  if (cand.size() && cand.size() <= V.size()) return;
  if (id == M) {
    if (sum == num * (num - 1) / 2) cand = V;
    return;
  }
  if (did[id][num][sum]) return;
  did[id][num][sum] = 1;
  for (int add = 1;; add++) {
    if (sum + add * A[id] < (num + add) * (num + add - 1) / 2) break;
    V.push_back(A[id]);
    hoge(id + 1, num + add, sum + add * A[id]);
  }
  while (V.size() && V.back() == A[id]) V.pop_back();
}
void solve() {
  int i, j, k, l, r, x, y;
  string s;
  cin >> M;
  for (i = 0; i < (M); i++) cin >> A[i];
  sort(A, A + M);
  hoge(0, 0, 0);
  if (cand.empty()) {
    cout << "=(" << endl;
    return;
  }
  for (y = 0; y < (cand.size()); y++)
    for (x = 0; x < (y); x++) mat[y][x] = 1, cand[y]--;
  vector<pair<int, int>> C;
  for (y = 0; y < (cand.size()); y++) {
    sort((C.begin()), (C.end()));
    reverse((C.begin()), (C.end()));
    for (auto& r : C)
      if (cand[y] < 0 && r.first > 0) {
        r.first--;
        cand[r.second]--;
        cand[y]++;
        mat[y][r.second] = 0;
        mat[r.second][y] = 1;
      }
    C.push_back({cand[y], y});
  }
  (void)printf("%d\n", cand.size());
  for (y = 0; y < (cand.size()); y++)
    for (x = 0; x < (y); x++) assert(mat[y][x] != mat[x][y]);
  for (y = 0; y < (cand.size()); y++) {
    for (x = 0; x < (cand.size()); x++) (void)printf("%d", mat[y][x]);
    (void)printf("\n");
  }
}
int main(int argc, char** argv) {
  string s;
  int i;
  if (argc == 1) ios::sync_with_stdio(false), cin.tie(0);
  for (i = 0; i < (argc - 1); i++) s += argv[i + 1], s += '\n';
  for (i = 0; i < (s.size()); i++) ungetc(s[s.size() - 1 - i], stdin);
  cout.tie(0);
  solve();
  return 0;
}
