#include <bits/stdc++.h>
using namespace std;
int n, m;
map<pair<pair<int, int>, int>, int> mp;
int a[15][15];
const char figure[4][3][3] = {
    {{'.', 'A', '.'}, {'.', 'A', '.'}, {'A', 'A', 'A'}},
    {{'A', 'A', 'A'}, {'.', 'A', '.'}, {'.', 'A', '.'}},
    {{'A', '.', '.'}, {'A', 'A', 'A'}, {'A', '.', '.'}},
    {{'.', '.', 'A'}, {'A', 'A', 'A'}, {'.', '.', 'A'}}};
int dfs(int x, int y, int mask) {
  pair<pair<int, int>, int> pi = make_pair(make_pair(x, y), mask);
  if (y > m) return dfs(x + 1, 1, mask);
  if (n < x + 2) return 0;
  if (mp.count(pi)) return mp[pi];
  int &ret = mp[pi] = 0;
  ret = dfs(x, y + 1, mask >> 1);
  if (y + 2 > m) return ret;
  for (int fig = 0; fig < 4; fig++) {
    bool flag = true;
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (figure[fig][i][j] == 'A') flag &= (mask & (1 << i * m + j)) == 0;
      }
    }
    if (flag == false) continue;
    int nmask = mask;
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++)
        if (figure[fig][i][j] == 'A') nmask |= (1 << (i * m + j));
    }
    ret = max(ret, dfs(x, y + 1, nmask >> 1) + 1);
  }
  return ret;
}
int recover_path(int x, int y, int mask, int res) {
  if (res == 0) return 0;
  if (y > m) return recover_path(x + 1, 1, mask, res);
  if (x + 2 > n) return 0;
  if (res == dfs(x, y + 1, mask >> 1)) {
    return recover_path(x, y + 1, mask >> 1, res);
  }
  if (y + 2 > m) return 0;
  for (int fig = 0; fig < 4; fig++) {
    bool flag = true;
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (figure[fig][i][j] == 'A') flag &= (mask & (1 << i * m + j)) == 0;
      }
    }
    if (flag == false) continue;
    int nmask = mask;
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++)
        if (figure[fig][i][j] == 'A') nmask |= (1 << (i * m + j));
    }
    if (res == dfs(x, y + 1, nmask >> 1) + 1) {
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
          if (figure[fig][i][j] == 'A') a[i + x][y + j] = res;
        }
      }
      return recover_path(x, y + 1, nmask >> 1, res - 1);
    }
  }
  return 0;
}
int main() {
  cin >> n >> m;
  int ans = dfs(1, 1, 0);
  cout << ans << endl;
  recover_path(1, 1, 0, ans);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cout << (char)(a[i][j] ? a[i][j] + 'A' - 1 : '.');
    cout << endl;
  }
  return 0;
}
