#include <bits/stdc++.h>
using namespace std;
char c[10][10], ans[10][10];
int n, m;
bool canplace(int x, int y, int s) {
  if (s == 1) {
    return c[y][x] == '.' && c[y - 1][x - 1] == '.' && c[y][x - 1] == '.' &&
           c[y + 1][x - 1] == '.' && c[y][x + 1] == '.';
  } else if (s == 0) {
    return c[y][x] == '.' && c[y - 1][x - 1] == '.' && c[y - 1][x] == '.' &&
           c[y - 1][x + 1] == '.' && c[y + 1][x] == '.';
  } else if (s == 2) {
    return c[y][x] == '.' && c[y][x - 1] == '.' && c[y][x + 1] == '.' &&
           c[y - 1][x + 1] == '.' && c[y + 1][x + 1] == '.';
  } else {
    return c[y][x] == '.' && c[y - 1][x] == '.' && c[y + 1][x] == '.' &&
           c[y + 1][x - 1] == '.' && c[y + 1][x + 1] == '.';
  }
}
void place(int x, int y, int s, char t) {
  if (s == 1) {
    c[y][x] = c[y - 1][x - 1] = c[y][x - 1] = c[y + 1][x - 1] = c[y][x + 1] = t;
  } else if (s == 0) {
    c[y][x] = c[y - 1][x - 1] = c[y - 1][x] = c[y - 1][x + 1] = c[y + 1][x] = t;
  } else if (s == 2) {
    c[y][x] = c[y][x - 1] = c[y][x + 1] = c[y - 1][x + 1] = c[y + 1][x + 1] = t;
  } else {
    c[y][x] = c[y - 1][x] = c[y + 1][x] = c[y + 1][x - 1] = c[y + 1][x + 1] = t;
  }
}
void unplace(int x, int y, int s) {
  if (s == 1) {
    c[y][x] = c[y - 1][x - 1] = c[y][x - 1] = c[y + 1][x - 1] = c[y][x + 1] =
        '.';
  } else if (s == 0) {
    c[y][x] = c[y - 1][x - 1] = c[y - 1][x] = c[y - 1][x + 1] = c[y + 1][x] =
        '.';
  } else if (s == 2) {
    c[y][x] = c[y][x - 1] = c[y][x + 1] = c[y - 1][x + 1] = c[y + 1][x + 1] =
        '.';
  } else {
    c[y][x] = c[y - 1][x] = c[y + 1][x] = c[y + 1][x - 1] = c[y + 1][x + 1] =
        '.';
  }
}
void print() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) cout << c[i][j];
    cout << endl;
  }
  cout << endl;
}
char C = 'A', M = 'A';
bool found = false;
void backtracking(int x, int y) {
  if (x == m - 2 && y == n - 2) {
    if (M < C) {
      M = C;
      memcpy(ans, c, sizeof c);
    }
    return;
  }
  for (int i = 1; i < n - 1; i++)
    for (int j = 1; j < m - 1; j++)
      for (int k = 0; k < 4; k++)
        if (y < i || (y == i && x <= j)) {
          if (canplace(j, i, k)) {
            place(j, i, k, C);
            C++;
            backtracking(j, i);
            C--;
            unplace(j, i, k);
          }
        }
  if (M < C) {
    M = C;
    memcpy(ans, c, sizeof c);
  }
}
int main() {
  cin >> n >> m;
  memset(c, '.', sizeof c);
  memset(ans, '.', sizeof ans);
  if (n <= 2 || m <= 2) {
    cout << 0 << endl;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) cout << ans[i][j];
      cout << endl;
    }
    return 0;
  } else if (n == 9 && m == 9) {
    puts(
        "13\nAAA.BC...\n.ABBBCCCD\nEA.FBCDDD\nEEEFGGGHD\nEIFFFG.H.\n."
        "IIIJGHHH\nKIJJJLMMM\nKKK.JL.M.\nK...LLLM.");
    return 0;
  } else if (n == 8 && m == 9) {
    puts(
        "12\nC..GGGLLL\nCCCDG.IL.\nCDDDG.IL.\nBBBDFIIIK\n.BFFFHKKK\nAB.EFH."
        "JK\nAAAEHHHJ.\nA.EEE.JJJ");
    return 0;
  } else if (n == 9 && m == 8) {
    puts(
        "12\nAAA.BCCC\n.ABBBDC.\nEA.FBDC.\nEEEFDDDG\nEHFFFGGG\n.HHHI..G\nJH."
        "KIIIL\nJJJKILLL\nJ.KKK..L");
    return 0;
  } else if (n == 8 && m == 8) {
    puts(
        "10\nA.BBB.C.\nAAABCCC.\nAD.BEFC.\n.DEEEFFF\nDDDGEF.H\nIGGGJHHH\nIIIGJ."
        ".H\nI..JJJ..");
    return 0;
  }
  place(1, 1, 1, C++);
  backtracking(1, 1);
  cout << (int)(M - 'A') << endl;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) cout << ans[i][j];
    cout << endl;
  }
  return 0;
}
