#include <bits/stdc++.h>
using namespace std;
int k, m, di[4], dj[4], sig[4];
bool app[100000000] = {0};
void reset() {
  for (int i = 0; i < 4; i++) dj[i] = di[i];
}
void iter(int d[4], int orig, int step) {
  if (m == 0) return;
  if (step == 3) {
    if (k - d[3] >= 0 && k - d[3] < 10000 && !app[(k - d[3]) * 10000 + orig]) {
      printf("%04d%04d\n", k - d[3], orig);
      app[(k - d[3]) * 10000 + orig] = true;
      m--;
    } else if (d[3] - k >= 0 && d[3] - k < 10000 &&
               !app[orig * 10000 + (d[3] - k)]) {
      printf("%04d%04d\n", orig, d[3] - k);
      app[orig * 10000 + (d[3] - k)] = true;
      m--;
    }
    return;
  }
  int dk[4];
  for (int i = step; i < 3; i++) {
    for (int j = 0; j < 4; j++) dk[j] = d[j];
    for (int j = i - 1; j >= step; j--) dk[j + 1] = dk[j];
    dk[i + 1] = d[i] + d[i + 1], iter(dk, orig, step + 1);
    dk[i + 1] = d[i] - d[i + 1], iter(dk, orig, step + 1);
    dk[i + 1] = -d[i] + d[i + 1], iter(dk, orig, step + 1);
    dk[i + 1] = -d[i] - d[i + 1], iter(dk, orig, step + 1);
    dk[i + 1] = d[i] * d[i + 1], iter(dk, orig, step + 1);
    dk[i + 1] = -d[i] * d[i + 1], iter(dk, orig, step + 1);
  }
  return;
}
int main() {
  scanf("%d %d", &k, &m);
  memset(sig, 0, sizeof(sig));
  for (int i = 0; i < 10000; i++) {
    if (m == 0) break;
    int ti = i;
    for (int j = 0; j < 4; j++) di[3 - j] = ti % 10, ti /= 10;
    iter(di, i, 0);
    reset();
    dj[1] = di[0] * 10 + di[1];
    iter(dj, i, 1);
    reset();
    dj[1] = di[0], dj[2] = di[1] * 10 + di[2];
    iter(dj, i, 1);
    reset();
    dj[1] = di[0], dj[2] = di[1], dj[3] = di[2] * 10 + di[3];
    iter(dj, i, 1);
    reset();
    dj[2] = di[0] * 10 + di[1], dj[3] = di[2] * 10 + di[3];
    iter(dj, i, 2);
    reset();
    dj[2] = di[0] * 100 + di[1] * 10 + di[2];
    iter(dj, i, 2);
    reset();
    dj[2] = di[0], dj[3] = di[1] * 100 + di[2] * 10 + di[3];
    iter(dj, i, 2);
    reset();
    dj[3] = i;
    iter(dj, i, 3);
    reset();
  }
  return 0;
}
