#include <bits/stdc++.h>
using namespace std;
int n, m, ans;
char grid[10][10], output[10][10];
bool addPiece(int type, int sign, int x, int y, char val) {
  if (type) {
    if ((x + 1 >= 0 & y >= 0 && x + 1 < n && y < m && grid[x + 1][y] == '.') &&
        (x - 1 >= 0 & y >= 0 && x - 1 < n && y < m && grid[x - 1][y] == '.') &&
        (x >= 0 & y + sign >= 0 && x < n && y + sign < m &&
         grid[x][y + sign] == '.') &&
        (x >= 0 & y + 2 * sign >= 0 && x < n && y + 2 * sign < m &&
         grid[x][y + 2 * sign] == '.')) {
      grid[x + 1][y] = grid[x - 1][y] = grid[x][y] = grid[x][y + sign] =
          grid[x][y + 2 * sign] = val;
      return true;
    }
  } else {
    if ((x >= 0 & y + 1 >= 0 && x < n && y + 1 < m && grid[x][y + 1] == '.') &&
        (x >= 0 & y - 1 >= 0 && x < n && y - 1 < m && grid[x][y - 1] == '.') &&
        (x + sign >= 0 & y >= 0 && x + sign < n && y < m &&
         grid[x + sign][y] == '.') &&
        (x + 2 * sign >= 0 & y >= 0 && x + 2 * sign < n && y < m &&
         grid[x + 2 * sign][y] == '.')) {
      grid[x][y + 1] = grid[x][y - 1] = grid[x][y] = grid[x + sign][y] =
          grid[x + 2 * sign][y] = val;
      return true;
    }
  }
  return false;
}
void remove(int type, int sign, int x, int y) {
  if (type) {
    grid[x + 1][y] = grid[x - 1][y] = grid[x][y] = grid[x][y + sign] =
        grid[x][y + 2 * sign] = '.';
  } else {
    grid[x][y + 1] = grid[x][y - 1] = grid[x][y] = grid[x + sign][y] =
        grid[x + 2 * sign][y] = '.';
  }
}
void backtrack(int pieces, int prevX, int prevY) {
  if (pieces > ans) {
    for (int i = 0, _i = (n); i < _i; ++i)
      for (int j = 0, _j = (m); j < _j; ++j) output[i][j] = grid[i][j];
    ans = max(ans, pieces);
  }
  if (((n - prevX + 1) * (m - prevY + 1)) / 5 + pieces < ans) return;
  if (pieces > (n * m) / 5) return;
  for (int x = (0), _x = (min(n, prevX + 4)); x < _x; ++x) {
    for (int y = (0), _y = (min(m, prevY + 4)); y < _y; ++y) {
      if (grid[x][y] != '.') continue;
      if (addPiece(1, 1, x, y, 'A' + pieces)) {
        backtrack(pieces + 1, x, y);
        remove(1, 1, x, y);
      }
      if (addPiece(1, -1, x, y, 'A' + pieces)) {
        backtrack(pieces + 1, x, y);
        remove(1, -1, x, y);
      }
      if (addPiece(0, 1, x, y, 'A' + pieces)) {
        backtrack(pieces + 1, x, y);
        remove(0, 1, x, y);
      }
      if (addPiece(0, -1, x, y, 'A' + pieces)) {
        backtrack(pieces + 1, x, y);
        remove(0, -1, x, y);
      }
    }
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  ans = 0;
  cin >> n >> m;
  for (int i = 0, _i = (n); i < _i; ++i)
    for (int j = 0, _j = (m); j < _j; ++j) grid[i][j] = output[i][j] = '.';
  backtrack(0, 0, 0);
  cout << ans << endl;
  for (int i = 0, _i = (n); i < _i; ++i) {
    for (int j = 0, _j = (m); j < _j; ++j) cout << output[i][j];
    cout << endl;
  }
}
