#include <bits/stdc++.h>
using namespace std;
map<int, long long> vst[10100];
int used[10100];
vector<long long> mk[10100];
int find() {
  for (int i = 0; i < 10; i++) mk[i].push_back(i);
  for (int i = 10; i < 100; i++) {
    mk[i].push_back(i);
    vst[i][i] = 1;
    int a = i / 10, b = i % 10;
    for (int j = 0; j < mk[a].size(); j++)
      for (int k = 0; k < mk[b].size(); k++) {
        long long u = mk[a][j], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
  }
  for (int i = 100; i < 1000; i++) {
    mk[i].push_back(i);
    vst[i][i] = 1;
    int a = i / 100, b = i % 100;
    for (int k = 0; k < mk[a].size(); k++)
      for (int j = 0; j < mk[b].size(); j++) {
        long long u = mk[a][k], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
    a = i / 10, b = i % 10;
    for (int k = 0; k < mk[a].size(); k++)
      for (int j = 0; j < mk[b].size(); j++) {
        long long u = mk[a][k], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
  }
  for (int i = 1000; i < 10000; i++) {
    mk[i].push_back(i);
    vst[i][i] = 1;
    int a = i / 1000, b = i % 1000;
    for (int k = 0; k < mk[a].size(); k++)
      for (int j = 0; j < mk[b].size(); j++) {
        long long u = mk[a][k], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
    a = i / 100, b = i % 100;
    for (int k = 0; k < mk[a].size(); k++)
      for (int j = 0; j < mk[b].size(); j++) {
        long long u = mk[a][k], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
    a = i / 10, b = i % 10;
    for (int k = 0; k < mk[a].size(); k++)
      for (int j = 0; j < mk[b].size(); j++) {
        long long u = mk[a][k], v = mk[b][j];
        if (!vst[i].count(abs(u - v))) mk[i].push_back(abs(u - v));
        vst[i][abs(u - v)] = 1;
        if (!vst[i].count(abs(u + v))) mk[i].push_back(abs(u + v));
        vst[i][abs(u + v)] = 1;
        if (!vst[i].count(abs(u * v))) mk[i].push_back(abs(u * v));
        vst[i][abs(u * v)] = 1;
      }
    int c;
    a = i / 1000, b = (i % 1000) / 10, c = i % 10;
    for (int j = 0; j < mk[a].size(); j++)
      for (int k = 0; k < mk[b].size(); k++)
        for (int r = 0; r < mk[c].size(); r++) {
          long long u = mk[a][j], v = mk[b][k], w = mk[c][r];
          if (!vst[i].count(abs(u + v + w))) mk[i].push_back(abs(u + v + w));
          vst[i][abs(u + v + w)] = 1;
          if (!vst[i].count(abs(u - v + w))) mk[i].push_back(abs(u - v + w));
          vst[i][abs(u - v + w)] = 1;
          if (!vst[i].count(abs(u + v - w))) mk[i].push_back(abs(u + v - w));
          vst[i][abs(u + v - w)] = 1;
          if (!vst[i].count(abs(u - v - w))) mk[i].push_back(abs(u - v - w));
          vst[i][abs(u - v - w)] = 1;
        }
  }
  return 0;
}
int main() {
  find();
  int N, K;
  cin >> N >> K;
  for (int i = 0; i < 10000 && K; i++)
    for (int j = 0; j < mk[i].size() && K; j++) {
      long long u = mk[i][j];
      long long v = abs(N - u), w = u + N;
      if (v < 0) v = -v;
      if (v < 10000LL && used[(int)v] < i + 1) {
        printf("%04d%04d\n", i, (int)v);
        K--;
        used[(int)v] = i + 1;
      }
      if (w < 10000LL && w != v && K && used[(int)w] < i + 1) {
        printf("%04d%04d\n", i, (int)w);
        K--;
        used[(int)w] = i + 1;
      }
      if (!K) return 0;
    }
  return 0;
}
