#include <bits/stdc++.h>
using namespace std;
inline long long labs(long long a) { return a < 0 ? (-a) : a; }
template <typename T>
inline T sqr(T x) {
  return x * x;
}
const int MAXN = 100;
int res[MAXN][MAXN];
int fres[MAXN][MAXN];
void Out(int n) {
  cout << n << endl;
  for (int(i) = 0; (i) < (n); (i)++) {
    for (int(j) = 0; (j) < (n); (j)++) {
      cout << res[i][j];
    }
    cout << endl;
  }
}
map<int, int> can;
bool Solve(int n, int k) {
  int kk = k;
  memset((res), 0, sizeof(res));
  for (int i = 1; i < n; i++) {
    res[0][i] = res[i][0] = 1;
  }
  for (int l = 1; l < n - 1 && k >= l; l++) {
    for (int i = 1; i + l < n && k >= l; i++) {
      int j = i + l;
      res[i][j] = res[j][i] = 1;
      k -= l;
      if (can[kk - k] == 0) can[kk - k] = n;
    }
  }
  return k == 0;
}
void Solve(const vector<pair<int, int> > &v) {
  memset((fres), 0, sizeof(fres));
  int sn = 0;
  for (int(k) = 0; (k) < (v.size()); (k)++) {
    Solve(v[k].second, v[k].first);
    for (int(i) = 0; (i) < (v[k].second); (i)++) {
      for (int(j) = 0; (j) < (v[k].second); (j)++) {
        fres[i + sn][j + sn] = res[i][j];
      }
    }
    sn += v[k].second;
  }
  for (int(i) = 0; (i) < (sn); (i)++) {
    for (int(j) = 0; (j) < (sn); (j)++) {
      res[i][j] = fres[i][j];
    }
  }
  Out(sn);
}
bool Solve(int k) {
  can.clear();
  for (int n = 3; n <= MAXN; n++) {
    if (Solve(n, k)) {
      Out(n);
      return true;
    }
  }
  for (int i = 1; i < k; i++) {
    map<int, int>::iterator it1 = can.find(i);
    map<int, int>::iterator it2 = can.find(k - i);
    if (it1 != can.end() && it2 != can.end() &&
        it1->second + it2->second <= MAXN) {
      vector<pair<int, int> > tmp;
      tmp.push_back(*it1);
      tmp.push_back(*it2);
      Solve(tmp);
      return true;
    }
  }
  return false;
}
int main() {
  int k;
  cin >> k;
  Solve(k);
  return 0;
}
