#include <bits/stdc++.h>
using namespace std;
class Solution {
 public:
  vector<string> build(int n, int m, vector<int>& cnts) {
    vector<int> cs = cnts;
    int i = 0, j = 1, k = 2;
    int sum = accumulate(cnts.begin(), cnts.end(), 0);
    string s;
    while (sum-- > 0) {
      if (cs[i] == 0) {
        i = k++;
      }
      if (i < cnts.size()) {
        s += 'A' + i;
        --cs[i];
      }
      if (cs[j] == 0) {
        j = k++;
      }
      if (j < cnts.size()) {
        s += 'A' + j;
        --cs[j];
      }
    }
    j = s.length() - 1;
    while (j - 1 >= 0 && s[j - 1] == s[j]) {
      --j;
    }
    i = j - 1;
    char ch1 = s[i];
    s[i] = s[j];
    char ch2 = s[j];
    int cols = 50;
    while (s.length() % cols != 0) {
      s += ch2;
    }
    s += string(cols, ch2);
    vector<string> res;
    for (int i = 0, j = 0; i < s.length() / cols; ++i, j += cols) {
      res.emplace_back(s.substr(j, cols));
      if (i % 2 != 0) {
        reverse(res.back().begin(), res.back().end());
      }
    }
    cs = count(res, cnts);
    int cnt = cnts[s[j] - 'A'] - cs[s[j] - 'A'];
    res.emplace_back(string(cols, ch1));
    int p = 0;
    string row;
    while (cnt-- > 0) {
      row += ch2;
      row += ch1;
    }
    while (row.length() > cols) {
      res.emplace_back(row.substr(0, cols));
      res.emplace_back(string(cols, ch1));
      row = row.substr(cols);
    }
    while (row.length() < cols) {
      row += ch1;
    }
    res.emplace_back(row);
    return res;
  }

 private:
  vector<int> count(vector<string>& s, vector<int>& cnts) {
    vector<int> res(cnts.size(), 0);
    int n = s.size();
    int m = s[0].length();
    vector<vector<bool>> visited(n, vector<bool>(m, false));
    vector<pair<int, int>> adjs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        if (!visited[i][j]) {
          visited[i][j] = true;
          char c = s[i][j];
          ++res[c - 'A'];
          queue<pair<int, int>> q;
          q.emplace(i, j);
          while (!q.empty()) {
            auto p = q.front();
            q.pop();
            for (auto& adj : adjs) {
              int x = p.first + adj.first;
              int y = p.second + adj.second;
              if (x >= 0 && x < n && y >= 0 && y < m && !visited[x][y] &&
                  s[x][y] == c) {
                visited[x][y] = true;
                q.emplace(x, y);
              }
            }
          }
        }
      }
    }
    return res;
  }
  void check(vector<int>& cnts, vector<int>& total) {
    int lessOne = 0;
    int same = 0;
    int lessSome = 0;
    int n = cnts.size();
    for (int i = 0; i < n; ++i) {
      if (cnts[i] == total[i]) {
        cout << ('a' + i) << ": " << cnts[i] << "=" << total[i] << endl;
      } else if (cnts[i] < total[i]) {
        cout << ('a' + i) << ": " << cnts[i] << "<" << total[i] << endl;
      } else {
        cout << "Error: " << ('a' + i) << ": " << cnts[i] << ">" << total[i]
             << endl;
      }
    }
  }
};
int main(int argc, char** argv) {
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  vector<int> cnts;
  cnts.push_back(a);
  cnts.push_back(b);
  cnts.push_back(c);
  cnts.push_back(d);
  Solution sol;
  auto res = sol.build(50, 50, cnts);
  cout << res.size() << " " << res[0].length() << endl;
  for (auto& s : res) {
    cout << s << endl;
  }
  return 0;
}
