#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:10000000")
const long double LDINF = 9128739847123.00;
const long double eps = 1e-9;
const int INF = 1 << 30;
const long double pi = fabs(atan2(0.0, -1.0));
using namespace std;
int n, m, a, b, c, ar[120][120];
void Load() { cin >> n >> m >> a >> b >> c; }
void Print() {
  int i, j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      printf("%c", ar[i][j]);
    }
    printf("\n");
  }
}
bool Full() {
  int i, j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      if (ar[i][j] == 0) break;
    }
    if (j <= m) break;
  }
  return i == n + 1;
}
char Ch(int i, int j, int c) {
  int k;
  if (c == 0) {
    for (k = 'a'; k <= 'z'; k++) {
      if (ar[i - 1][j] == k) continue;
      if (ar[i - 1][j + 1] == k) continue;
      if (ar[i][j - 1] == k) continue;
      if (ar[i][j + 2] == k) continue;
      if (ar[i + 1][j - 1] == k) continue;
      if (ar[i + 1][j + 2] == k) continue;
      if (ar[i + 2][j] == k) continue;
      if (ar[i + 2][j + 1] == k) continue;
      break;
    }
    return k;
  }
  if (c == 1) {
    for (k = 'a'; k <= 'z'; k++) {
      if (ar[i - 1][j] == k) continue;
      if (ar[i - 1][j + 1] == k) continue;
      if (ar[i][j - 1] == k) continue;
      if (ar[i][j + 2] == k) continue;
      if (ar[i + 1][j] == k) continue;
      if (ar[i + 1][j + 1] == k) continue;
      break;
    }
    return k;
  }
  if (c == 2) {
    for (k = 'a'; k <= 'z'; k++) {
      if (ar[i][j - 1] == k) continue;
      if (ar[i + 1][j - 1] == k) continue;
      if (ar[i - 1][j] == k) continue;
      if (ar[i + 2][j] == k) continue;
      if (ar[i][j + 1] == k) continue;
      if (ar[i + 1][j + 1] == k) continue;
      break;
    }
    return k;
  }
}
void Solve2();
void Solve() {
  int a = ::a;
  int b = ::b;
  int c = ::c;
  if ((n * m) % 2 == 1) {
    cout << "IMPOSSIBLE";
    return;
  }
  int i, j;
  for (i = 1; c > 0 && i + 1 <= n; i += 2) {
    for (j = 1; c > 0 && j + 1 <= m; j += 2) {
      ar[i][j] = ar[i][j + 1] = ar[i + 1][j] = ar[i + 1][j + 1] = Ch(i, j, 0);
      c--;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  int put = 0;
  for (i = 1; a > 0 && i + 1 <= m; i++) {
    for (j = 1; a > 0 && j <= n; j++) {
      if (!(ar[j][i] == 0 && ar[j][i + 1] == 0)) continue;
      if (a == 1 && put % 2 == 0) break;
      ar[j][i] = ar[j][i + 1] = Ch(j, i, 1);
      a--;
      put++;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  put = 0;
  for (i = 1; b > 0 && i + 1 <= n; i++) {
    for (j = 1; b > 0 && j <= m; j++) {
      if (ar[i][j] != 0 || ar[i + 1][j] != 0) continue;
      ar[i][j] = ar[i + 1][j] = Ch(i, j, 2);
      b--;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  Solve2();
}
void Solve2() {
  memset(ar, 0, sizeof(ar));
  if ((n * m) % 2 == 1) {
    cout << "IMPOSSIBLE";
    return;
  }
  int i, j;
  int ch = 'a';
  for (i = 1; c > 0 && i + 1 <= n; i += 2) {
    for (j = 1; c > 0 && j + 1 <= m; j += 2) {
      ar[i][j] = ar[i][j + 1] = ar[i + 1][j] = ar[i + 1][j + 1] = Ch(i, j, 0);
      c--;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  int put = 0;
  for (i = 1; b > 0 && i + 1 <= n; i++) {
    for (j = 1; b > 0 && j <= m; j++) {
      if (ar[i][j] != 0 || ar[i + 1][j] != 0) continue;
      if (b == 1 && put % 2 == 0) break;
      ar[i][j] = ar[i + 1][j] = Ch(i, j, 2);
      b--;
      put++;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  for (i = 1; a > 0 && i + 1 <= m; i++) {
    for (j = 1; a > 0 && j <= n; j++) {
      if (!(ar[j][i] == 0 && ar[j][i + 1] == 0)) continue;
      ar[j][i] = ar[j][i + 1] = Ch(j, i, 1);
      a--;
    }
  }
  if (Full()) {
    Print();
    return;
  }
  printf("IMPOSSIBLE");
}
int main() {
  Load();
  Solve();
  return 0;
}
