#include <bits/stdc++.h>
using namespace std;
long long rt(long long a) {
  long long p = 0, q = a;
  while (p < q) {
    long long s = (p + q + 1) / 2;
    long long sv = s * (s + 1) / 2;
    if (sv < a) p = s;
    if (sv > a) q = s - 1;
    if (sv == a) return s;
  }
  if (p * (p + 1) / 2 == a) return p;
  return -1;
}
long long a, b, c, d;
bool possible(long long z, long long j) {
  long long n = z + j;
  if (a + b + c + d != n * (n - 1) / 2) {
    return 0;
  }
  return 1;
}
bool solve(long long z, long long j) {
  if (!possible(z, j)) {
    return 0;
  }
  long long n = z + j;
  if (j == 0) {
    for (int i = 0; i < n; i++) cout << "0";
    return 1;
  }
  if (z == 0) {
    for (int i = 0; i < n; i++) cout << "1";
    return 1;
  }
  long long ord[5];
  ord[0] = b / j;
  ord[2] = (ord[0] * j != b);
  ord[3] = b - ord[0] * j;
  ord[4] = z - ord[0] - ord[2];
  ord[1] = j - ord[3];
  for (int i = 0; i < 5; i++) {
    for (int k = 0; k < ord[i]; k++) {
      cout << (i % 2);
    }
  }
  return 1;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> a >> b >> c >> d;
  if (a + b + c + d == 0) {
    cout << "1\n";
    return 0;
  }
  long long z = rt(a);
  long long j = rt(d);
  if (z == -1 || j == -1) {
    cout << "Impossible\n";
    return 0;
  }
  ++z;
  ++j;
  if (z == 1 && j == 1) {
    if (solve(0, 0)) return 0;
    if (solve(0, 1)) return 0;
    if (solve(1, 0)) return 0;
    if (solve(1, 1)) return 0;
    cout << "Impossible\n";
    return 0;
  }
  if (z == 1) {
    if (solve(0, j)) return 0;
    if (solve(1, j)) return 0;
    cout << "Impossible\n";
    return 0;
  }
  if (j == 1) {
    if (solve(z, 0)) return 0;
    if (solve(z, 1)) return 0;
    cout << "Impossible\n";
    return 0;
  }
  if (solve(z, j)) return 0;
  cout << "Impossible\n";
  return 0;
}
