#include <bits/stdc++.h>
const int N = 1e3 + 10;
const int MOD = 1e9 + 7;
const int INF = 2e9;
const long long INFLL = 2e18;
using namespace std;
vector<string> ans;
int a[N], f[N];
int n;
int check() {
  int ans = a[0];
  for (int i = 1; i < n; i++)
    if (a[i] != ans) return -1;
  return ans;
}
int check2(int pos) {
  int ans = a[pos] - 1;
  for (int i = 0; i < n; i++) {
    if (i == pos) continue;
    if (a[i] != ans) return -1;
  }
  return ans;
}
struct cmp {
  bool operator()(int x, int y) { return a[x] < a[y]; }
};
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  int minx = INF;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    minx = min(minx, a[i]);
  }
  priority_queue<int, vector<int>, cmp> p;
  string tmp;
  for (int i = 0; i < n; i++) p.push(i);
  for (int i = 0; i < n; i++) tmp += "0";
  int res;
  int sum = 0;
  for (int i = 0; i < n; i++) sum += a[i] - minx;
  while (1) {
    res = check();
    if (res != -1) break;
    int w = p.top();
    p.pop();
    res = check2(w);
    if (ans.size() && res != -1) {
      if (ans[ans.size() - 1][w] == '0') {
        ans[ans.size() - 1][w] = '1';
        break;
      }
    }
    string s = tmp;
    int u = p.top();
    p.pop();
    s[w] = '1';
    s[u] = '1';
    if (a[u] > 0) a[u]--;
    if (a[w] > 0) a[w]--;
    p.push(w);
    p.push(u);
    ans.push_back(s);
  }
  cout << res << endl;
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << endl;
  return 0;
}
