#include <bits/stdc++.h>
long long int maxx(long long int a, long long int b) { return a > b ? a : b; }
long long int minn(long long int a, long long int b) { return a > b ? b : a; }
using namespace std;
int dx[] = {1, 1, 1, 0, 0, -1, -1, -1, 0};
int dy[] = {-1, 0, 1, 1, -1, 0, 1, -1, 0};
void boostIO() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
long long int gcd(long long int a, long long int b) {
  return b == 0 ? a : gcd(b, a % b);
}
long long int lcm(long long int a, long long int b) {
  return (a * b) / gcd(a, b);
}
long long int poww(long long int base, long long int exp) {
  base %= 1000000007;
  long long int result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % 1000000007;
    base = (base * base) % 1000000007;
    exp >>= 1;
  }
  return result;
}
char ans[200][200];
void fills(int n, int m, char x) {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (ans[i][j] == 'x') {
        ans[i][j] = x;
      }
    }
  }
  return;
}
int mx = 48;
int main() {
  vector<pair<int, char>> flowers;
  memset(ans, 'x', sizeof(ans));
  for (int i = 'A'; i <= 'D'; i++) {
    int x;
    cin >> x;
    flowers.push_back(make_pair(x, i));
  }
  sort(flowers.begin(), flowers.end()), reverse(flowers.begin(), flowers.end());
  int n = 1, m = 1, idx_n = 1, idx_m = 1;
  for (int i = 0; i < 4; i++) {
    if (i == 2 && flowers.back().first != 1) {
      while (flowers[i].first != 1) {
        ans[idx_n][idx_m] = flowers[i].second;
        ans[idx_n + 1][idx_m] = flowers.back().second;
        ans[idx_n][idx_m + 1] = flowers.back().second;
        ans[idx_n + 1][idx_m + 1] = flowers.back().second;
        idx_m = (idx_m + 2);
        n = max(n, idx_n + 1), m = max(m, idx_m + 1);
        if (idx_m > mx) {
          idx_m = 1;
          idx_n = idx_n + 2;
        }
        flowers[i].first--;
      }
      n = n + 2;
      fills(n, m, flowers[2].second);
      flowers.back().first--;
      idx_m = 1, idx_n = idx_n + 4;
      n = max(n, idx_n + 1), m = max(m, idx_m + 1);
      swap(flowers[2], flowers[3]);
      while (flowers[i].first--) {
        ans[idx_n][idx_m] = flowers[i].second;
        ans[idx_n + 1][idx_m] = flowers.back().second;
        ans[idx_n][idx_m + 1] = flowers.back().second;
        ans[idx_n + 1][idx_m + 1] = flowers.back().second;
        idx_m = (idx_m + 2);
        n = max(n, idx_n + 1), m = max(m, idx_m + 1);
        if (idx_m > mx) {
          idx_m = 1;
          idx_n = idx_n + 2;
        }
      }
      break;
    }
    while (flowers[i].first--) {
      ans[idx_n][idx_m] = flowers[i].second;
      ans[idx_n + 1][idx_m] = flowers.back().second;
      ans[idx_n][idx_m + 1] = flowers.back().second;
      ans[idx_n + 1][idx_m + 1] = flowers.back().second;
      idx_m = (idx_m + 2);
      n = max(n, idx_n + 1), m = max(m, idx_m + 1);
      if (idx_m > mx) {
        idx_m = 1;
        idx_n = idx_n + 2;
      }
    }
  }
  cout << n << " " << m << endl;
  fills(n, m, flowers[3].second);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cout << ans[i][j];
    }
    cout << endl;
  }
}
