#include <bits/stdc++.h>
using namespace std;
int MSK;
int dp[1 << 19][9][9];
int adj[4][2];
int n, m;
int f(int bt, int r, int c) {
  if (r >= n - 2) return 0;
  int &res = dp[bt][r][c];
  if (res != -1) return res;
  if (m - c < 3) {
    res = f((bt << (m - c)) & MSK, r + 1, 0);
  } else {
    res = f((bt << 1) & MSK, r, c + 1);
    int bt2 = (bt >> 1);
    int b = (bt & 1) << 2;
    for (int i = 0; i < 4; i++) {
      if (bt2 & adj[i][0]) continue;
      if (b & adj[i][1]) continue;
      int k = (((bt2 | adj[i][0]) << 3) | (adj[i][1] | b)) & MSK;
      k = f(k, r, c + 2) + 1;
      if (k > res) {
        res = k;
      }
    }
  }
  return res;
}
string s[11];
char alp = 'A';
string T[4][3] = {{"###", ".#.", ".#."},
                  {"..#", "###", "..#"},
                  {".#.", ".#.", "###"},
                  {"#..", "###", "#.."}};
void print(int bt, int r, int c) {
  if (r >= n - 2) return;
  if (m - c < 3) {
    print((bt << (m - c)) & MSK, r + 1, 0);
  } else {
    int bt2 = (bt >> 1);
    int b = (bt & 1) << 2;
    int x = 0;
    for (x = 0; x < 4; x++) {
      if (bt2 & adj[x][0]) continue;
      if (b & adj[x][1]) continue;
      int k = (((bt2 | adj[x][0]) << 3) | (adj[x][1] | b)) & MSK;
      if (dp[bt][r][c] == f(k, r, c + 2) + 1) {
        for (int i = 0; i < 3; i++) {
          for (int j = 0; j < 3; j++)
            if (T[x][i][j] == '#') s[r + i][c + j] = alp;
        }
        alp++;
        print(k, r, c + 2);
        break;
      }
    }
    if (x == 4) print((bt << 1) & MSK, r, c + 1);
  }
}
int main() {
  cin >> n >> m;
  MSK = (1 << (2 * m + 1)) - 1;
  int a[4][3] = {{7, 2, 2}, {1, 7, 1}, {2, 2, 7}, {4, 7, 4}};
  for (int i = 0; i < 4; i++) {
    adj[i][0] = (a[i][0] << (2 * m - 3)) | (a[i][1] << (m - 3));
    adj[i][1] = a[i][2];
  }
  for (int i = 0; i < m; i++) s[0] += '.';
  for (int i = 1; i < n; i++) s[i] = s[0];
  memset(dp, -1, sizeof dp);
  int ans = f(0, 0, 0);
  cout << ans << endl;
  print(0, 0, 0);
  for (int i = 0; i < n; i++) cout << s[i] << endl;
  return 0;
}
