#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 9 + 1;
int mark[MAX_N][MAX_N];
int n, m, cnt, ans[MAX_N][MAX_N];
int dx[4][5] = {
    {0, 0, 0, 1, 2}, {0, 1, 2, 2, 2}, {0, 1, 2, 1, 1}, {0, 1, 2, 1, 1}};
int dy[4][5] = {
    {0, 1, 2, 1, 1}, {0, 0, 0, -1, 1}, {0, 0, 0, -1, -2}, {0, 0, 0, 1, 2}};
bool isValid(int x, int y) { return x >= 0 && y >= 0 && x < n && y < m; }
bool canToFill(int x, int y, int id) {
  for (int i = 0; i < 5; i++) {
    int a = x + dx[id][i], b = y + dy[id][i];
    if (!isValid(a, b) || mark[a][b]) return false;
  }
  return true;
}
void bt(int x, int y, int left, int tmp) {
  if (y == m) return bt(x + 1, 0, left, tmp);
  if (x == n) {
    if (tmp - 1 > cnt) {
      cnt = tmp - 1;
      for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) ans[i][j] = mark[i][j];
    }
    return;
  }
  if (mark[x][y]) return bt(x, y + 1, left, tmp);
  if (tmp - 1 + left / 5 <= cnt) return;
  for (int i = 0; i < 4; i++)
    if (canToFill(x, y, i)) {
      for (int j = 0; j < 5; j++) mark[x + dx[i][j]][y + dy[i][j]] = tmp;
      bt(x, y + 1, left - 5, tmp + 1);
      for (int j = 0; j < 5; j++) mark[x + dx[i][j]][y + dy[i][j]] = 0;
    }
  bt(x, y + 1, left - 1, tmp);
}
int main() {
  ios_base ::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  cin >> n >> m;
  bt(0, 0, n * m, 1), cout << cnt << endl;
  for (int i = 0; i < n; cout << endl, i++)
    for (int j = 0; j < m; j++)
      cout << (ans[i][j] ? (char)('A' + ans[i][j] - 1) : '.');
  return 0;
}
