#include <bits/stdc++.h>
using namespace std;
int di[4][5] = {
    {0, 1, 2, 1, 1}, {2, 0, 1, 2, 2}, {1, 1, 0, 1, 2}, {0, 0, 1, 2, 0}};
int dj[4][5] = {
    {0, 0, 0, 1, 2}, {0, 1, 1, 1, 2}, {0, 1, 2, 2, 2}, {0, 1, 1, 1, 2}};
int w[10][10], g[10][10];
int n, m, ans;
int check(int i, int j) {
  if (i < n && j < m) return 1;
  return 0;
}
void go(int i, int j, int d, int f) {
  if (d > ans) {
    ans = d;
    for (int k = 0; k < (n); k++)
      for (int l = 0; l < (m); l++) g[k][l] = w[k][l];
  }
  if (j == m - 2) {
    j = 0;
    i++;
    if (i == n - 2) return;
  }
  if (d + f / 5 <= ans) return;
  if (d + ((n - i) * m - j) / 5 <= ans) return;
  for (int k = 0; k < (4); k++) {
    int ok = 1, ni, nj;
    for (int l = 0; l < (5); l++) {
      ni = i + di[k][l];
      nj = j + dj[k][l];
      if (check(ni, nj) && w[ni][nj] == 0) continue;
      ok = 0;
      break;
    }
    if (ok) {
      for (int l = 0; l < (5); l++) {
        ni = i + di[k][l];
        nj = j + dj[k][l];
        w[ni][nj] = d + 1;
      }
      f -= (w[i][j] == 0);
      go(i, j, d + 1, f - 5);
      f += (w[i][j] == 0);
      for (int l = 0; l < (5); l++) {
        ni = i + di[k][l];
        nj = j + dj[k][l];
        w[ni][nj] = 0;
      }
    }
  }
  go(i, j + 1, d, f - (w[i][j] == 0));
}
int main() {
  while (cin >> n >> m) {
    if (n < 3 || m < 3) {
      cout << 0 << endl;
      for (int i = 0; i < (n); i++) {
        for (int j = 0; j < (m); j++) cout << ".";
        cout << endl;
      }
      continue;
    }
    memset(w, 0, sizeof(w));
    memset(g, 0, sizeof(g));
    ans = 0;
    go(0, 0, 0, n * m);
    cout << ans << endl;
    for (int i = 0; i < (n); i++) {
      for (int j = 0; j < (m); j++)
        if (g[i][j] == 0)
          cout << '.';
        else
          cout << char(g[i][j] - 1 + 'A');
      cout << endl;
    }
  }
}
