#include <bits/stdc++.h>
using namespace std;
const int INF = numeric_limits<int>::max();
const long long LLINF = numeric_limits<long long>::max();
const unsigned long long ULLINF = numeric_limits<unsigned long long>::max();
const double PI = acos(-1.0);
string start = "";
vector<string> jail(int cnt, char A, char B) {
  if (cnt == 0) {
    vector<string> ans;
    string res = "";
    for (int i = 0; i < 50; i++) res.push_back(A);
    ans.push_back(res);
    return ans;
  }
  int rows = 2 * ((cnt + 24) / 25) + 1;
  vector<string> ans(rows, start);
  int curR = 1, curC = 1;
  while (cnt--) {
    if (curC > 49) curC = 1, curR += 2;
    ans[curR][curC] = B;
    curC += 2;
  }
  for (auto& s : ans) {
    for (char& c : s) {
      if (c == '.') c = A;
    }
  }
  return ans;
}
vector<string> solve(int a, int b, char A, char B) {
  if (a < b) swap(a, b), swap(A, B);
  vector<string> ans;
  for (auto k : jail(a - 1, B, A)) ans.push_back(k);
  for (auto k : jail(b - 1, A, B)) ans.push_back(k);
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  for (int i = 0; i < 50; i++) start += '.';
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  vector<string> res;
  for (auto k : solve(a, b, 'A', 'B')) res.push_back(k);
  for (auto k : solve(c, d, 'C', 'D')) res.push_back(k);
  cout << res.size() << " " << 50 << '\n';
  for (auto k : res) cout << k << '\n';
  return 0;
}
