#include <bits/stdc++.h>
using namespace std;
const int N = 128;
int g[N][N];
bool try3(int n, int m, int a, int b, int c) {
  int tr[3] = {a, b, c};
  for (int i = 0; i < n; i += 2)
    for (int j = 0; j < m; j += 2) {
      if (tr[0] >= 2) {
        tr[0] -= 2;
        int base = (j / 2) % 2;
        g[i][j] = g[i][j + 1] = base + 'a';
        g[i + 1][j] = g[i + 1][j + 1] = 1 - base + 'a';
      } else if (tr[1] >= 2) {
        tr[1] -= 2;
        int base = (i / 2) % 2;
        g[i][j] = g[i + 1][j] = base + 'c';
        g[i][j + 1] = g[i + 1][j + 1] = 1 - base + 'c';
      } else if (tr[2] >= 1) {
        tr[2] -= 1;
        int base = (i / 2 + j / 2) % 2;
        g[i][j] = g[i + 1][j + 1] = g[i][j + 1] = g[i + 1][j] = base + 'e';
      } else
        return false;
    }
  return true;
}
bool try1(int n, int m, int a, int b, int c) {
  if (a < m / 2) return false;
  for (int i = 0; i < m; i += 2) {
    g[n - 1][i] = g[n - 1][i + 1] = (i / 2) % 2 + 'x';
  }
  a -= m / 2;
  return try3(n - 1, m, a, b, c);
}
bool try2(int n, int m, int a, int b, int c) {
  if (b < n / 2) return false;
  for (int i = 0; i < n; i += 2)
    g[i][m - 1] = g[i + 1][m - 1] = (i / 2) % 2 + 'x';
  b -= n / 2;
  return try3(n, m - 1, a, b, c);
}
int main() {
  int n, m, a, b, c;
  scanf("%d %d %d %d %d", &n, &m, &a, &b, &c);
  if (n * m % 2 == 1) {
    printf("IMPOSSIBLE\n");
    return 0;
  }
  bool can = false;
  if (n % 2 == 1) {
    can = try1(n, m, a, b, c);
  } else if (m % 2 == 1) {
    can = try2(n, m, a, b, c);
  } else {
    can = try3(n, m, a, b, c);
  }
  if (!can) {
    printf("IMPOSSIBLE\n");
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) printf("%c", g[i][j]);
    printf("\n");
  }
  return 0;
}
