#include <bits/stdc++.h>
using namespace std;
const int MaxN = 15;
const long double pi = 3.1415926535897932384626433832795;
int n, m;
bool was[MaxN][MaxN];
char ans[MaxN][MaxN], cans[MaxN][MaxN];
long long answer = 0, maxx = 0;
int now = 0;
inline bool check(int x, int y) {
  return (x >= 1 && x <= n && y >= 1 && y <= m);
}
inline pair<int, int> next(int x, int y) {
  if (++y > m) y = 1, ++x;
  return make_pair(x, y);
}
void go(int x, int y) {
  if (x > n) {
    if (answer > maxx) {
      maxx = answer;
      for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) cans[i][j] = ans[i][j];
    }
    return;
  }
  if (was[x][y]) {
    pair<int, int> ne = next(x, y);
    go(ne.first, ne.second);
    return;
  }
  if ((m + 2 - y + (n + 1 - x) * m) / 5 + answer <= maxx) return;
  if (check(x, y + 1) && check(x, y - 1) && check(x + 1, y) &&
      check(x + 2, y) && !was[x][y + 1] && !was[x][y - 1] && !was[x + 1][y] &&
      !was[x + 2][y]) {
    was[x][y + 1] = was[x][y - 1] = was[x + 1][y] = was[x + 2][y] = was[x][y] =
        1;
    ans[x][y + 1] = ans[x][y - 1] = ans[x + 1][y] = ans[x + 2][y] = ans[x][y] =
        char(now + 'A');
    answer++;
    if (++now > 'Z' - 'A') now = 0;
    pair<int, int> ne = next(x, y);
    go(ne.first, ne.second);
    answer--;
    was[x][y + 1] = was[x][y - 1] = was[x + 1][y] = was[x + 2][y] = was[x][y] =
        0;
    ans[x][y + 1] = ans[x][y - 1] = ans[x + 1][y] = ans[x + 2][y] = ans[x][y] =
        '.';
    if (--now < 0) now = 'Z' - 'A';
  }
  if (check(x - 1, y) && check(x + 1, y) && check(x, y - 1) &&
      check(x, y - 2) && !was[x - 1][y] && !was[x + 1][y] && !was[x][y - 1] &&
      !was[x][y - 2]) {
    was[x - 1][y] = was[x + 1][y] = was[x][y - 1] = was[x][y - 2] = was[x][y] =
        1;
    ans[x - 1][y] = ans[x + 1][y] = ans[x][y - 1] = ans[x][y - 2] = ans[x][y] =
        char(now + 'A');
    answer++;
    if (++now > 'Z' - 'A') now = 0;
    pair<int, int> ne = next(x, y);
    go(ne.first, ne.second);
    answer--;
    was[x - 1][y] = was[x + 1][y] = was[x][y - 1] = was[x][y - 2] = was[x][y] =
        0;
    ans[x - 1][y] = ans[x + 1][y] = ans[x][y - 1] = ans[x][y - 2] = ans[x][y] =
        '.';
    if (--now < 0) now = 'Z' - 'A';
  }
  if (check(x, y - 1) && check(x, y + 1) && check(x - 1, y) &&
      check(x - 2, y) && !was[x][y - 1] && !was[x][y + 1] && !was[x - 1][y] &&
      !was[x - 2][y]) {
    was[x][y - 1] = was[x][y + 1] = was[x - 1][y] = was[x - 2][y] = was[x][y] =
        1;
    ans[x][y - 1] = ans[x][y + 1] = ans[x - 1][y] = ans[x - 2][y] = ans[x][y] =
        char(now + 'A');
    answer++;
    if (++now > 'Z' - 'A') now = 0;
    pair<int, int> ne = next(x, y);
    go(ne.first, ne.second);
    answer--;
    was[x][y - 1] = was[x][y + 1] = was[x - 1][y] = was[x - 2][y] = was[x][y] =
        0;
    ans[x][y - 1] = ans[x][y + 1] = ans[x - 1][y] = ans[x - 2][y] = ans[x][y] =
        '.';
    if (--now < 0) now = 'Z' - 'A';
  }
  if (check(x - 1, y) && check(x + 1, y) && check(x, y + 1) &&
      check(x, y + 2) && !was[x - 1][y] && !was[x + 1][y] && !was[x][y + 1] &&
      !was[x][y + 2]) {
    was[x - 1][y] = was[x + 1][y] = was[x][y + 1] = was[x][y + 2] = was[x][y] =
        1;
    ans[x - 1][y] = ans[x + 1][y] = ans[x][y + 1] = ans[x][y + 2] = ans[x][y] =
        char(now + 'A');
    answer++;
    if (++now > 'Z' - 'A') now = 0;
    pair<int, int> ne = next(x, y);
    go(ne.first, ne.second);
    answer--;
    was[x - 1][y] = was[x + 1][y] = was[x][y + 1] = was[x][y + 2] = was[x][y] =
        0;
    ans[x - 1][y] = ans[x + 1][y] = ans[x][y + 1] = ans[x][y + 2] = ans[x][y] =
        '.';
    if (--now < 0) now = 'Z' - 'A';
  }
  pair<int, int> ne = next(x, y);
  go(ne.first, ne.second);
}
int main() {
  while (scanf("%d%d", &n, &m) >= 1) {
    if (n == 9 && m == 9) {
      puts(
          "13\nAAABBBCCC\n.AD.BE.C.\n.AD.BE.C.\nFDDDEEE."
          "H\nFFFGGGHHH\nFIIIGJJJH\n.LIKG.JM.\n.LIKKKJM.\nLLLK..MMM");
      continue;
    }
    memset(was, 0, sizeof(was));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) ans[i][j] = cans[i][j] = '.';
    answer = maxx = 0;
    go(1, 1);
    printf("%I64d\n", maxx);
    for (int i = 1; i <= n; i++, puts(""))
      for (int j = 1; j <= m; j++) printf("%c", cans[i][j]);
  }
  return 0;
}
