#include <bits/stdc++.h>
using namespace std;
unsigned long number(unsigned long d0, unsigned long d1) {
  return d0 * 10 + d1;
}
unsigned long number(unsigned long d0, unsigned long d1, unsigned long d2) {
  return d0 * 100 + d1 * 10 + d2;
}
unsigned long number(unsigned long d0, unsigned long d1, unsigned long d2,
                     unsigned long d3) {
  return d0 * 1000 + d1 * 100 + d2 * 10 + d3;
  ;
}
string num_string(unsigned long d0, unsigned long d1, unsigned long d2,
                  unsigned long d3) {
  string result;
  result.push_back(d0 + '0');
  result.push_back(d1 + '0');
  result.push_back(d2 + '0');
  result.push_back(d3 + '0');
  return result;
}
int main(void) {
  ios::sync_with_stdio(false);
  unsigned long k = 0, m = 0;
  cin >> k >> m;
  map<long, set<string> > options;
  for (unsigned long x = 0; x <= 9999; x++) {
    unsigned long x_remain = x;
    unsigned long x3 = x_remain % 10;
    x_remain /= 10;
    unsigned long x2 = x_remain % 10;
    x_remain /= 10;
    unsigned long x1 = x_remain % 10;
    x_remain /= 10;
    unsigned long x0 = x_remain % 10;
    string x_str = num_string(x0, x1, x2, x3);
    options[x0 + x1 + x2 + x3].insert(x_str);
    options[x0 + x1 + x2 - x3].insert(x_str);
    options[x0 + x1 - x2 + x3].insert(x_str);
    options[x0 - x1 + x2 + x3].insert(x_str);
    options[x0 + x1 - x2 - x3].insert(x_str);
    options[x0 - x1 - x2 + x3].insert(x_str);
    options[x0 - x1 + x2 - x3].insert(x_str);
    options[x0 + x1 + x2 * x3].insert(x_str);
    options[x0 + x1 * x2 + x3].insert(x_str);
    options[x0 * x1 + x2 + x3].insert(x_str);
    options[x0 * x1 + x2 * x3].insert(x_str);
    options[x0 * x1 * x2 + x3].insert(x_str);
    options[x0 + x1 * x2 * x3].insert(x_str);
    options[x0 - x1 * x2 * x3].insert(x_str);
    options[x0 + x1 + x2 + x3].insert(x_str);
    options[x0 + x1 + (x2 - x3)].insert(x_str);
    options[x0 + (x1 - x2) + x3].insert(x_str);
    options[x0 - (x1 + x2) + x3].insert(x_str);
    options[x0 + (x1 - x2 - x3)].insert(x_str);
    options[x0 - x1 - (x2 + x3)].insert(x_str);
    options[(x0 - x1) + x2 - x3].insert(x_str);
    options[x0 + (x1 + x2) * x3].insert(x_str);
    options[(x0 + x1) * x2 + x3].insert(x_str);
    options[x0 * (x1 + x2) + x3].insert(x_str);
    options[x0 * (x1 + x2 * x3)].insert(x_str);
    options[x0 * (x1 * x2 + x3)].insert(x_str);
    options[(x0 + x1) * x2 * x3].insert(x_str);
    options[(x0 - x1) * x2 * x3].insert(x_str);
    unsigned long x0x1 = number(x0, x1);
    unsigned long x2x3 = number(x2, x3);
    unsigned long x0x1x2 = number(x0, x1, x2);
    unsigned long x1x2x3 = number(x1, x2, x3);
    options[x0 + x1 + x2x3].insert(x_str);
    options[x0 - x1 + x2x3].insert(x_str);
    options[x0 + x1 - x2x3].insert(x_str);
    options[x0 - x1 - x2x3].insert(x_str);
    options[x0 + x1 * x2x3].insert(x_str);
    options[x0 * x1 + x2x3].insert(x_str);
    options[x0 * x1 * x2x3].insert(x_str);
    options[x0x1 + x2x3].insert(x_str);
    options[x0x1 - x2x3].insert(x_str);
    options[x0x1 * x2x3].insert(x_str);
    options[x0x1x2 + x3].insert(x_str);
    options[x0x1x2 - x3].insert(x_str);
    options[x0 + x1x2x3].insert(x_str);
    options[x0 - x1x2x3].insert(x_str);
    options[x0 + x1 * (x2 + x3)].insert(x_str);
    options[(x0 + x1) * (x2 + x3)].insert(x_str);
    options[(x0 + x1 + x2) * x3].insert(x_str);
    options[x0x1 * (x2 + x3)].insert(x_str);
    options[x0x1 * (x2 - x3)].insert(x_str);
    options[x0x1 * (x2 + x3)].insert(x_str);
    options[x0 + x1 * x2x3].insert(x_str);
    options[(x0 - x1) + x2x3].insert(x_str);
    options[(x0 * x1) - x2x3].insert(x_str);
    options[x0 - (x1 - x2x3)].insert(x_str);
    options[(x0 + x1) * x2x3].insert(x_str);
    options[x0 * (x1 + x2x3)].insert(x_str);
    options[(x0 + x1) * (x2 + x3)].insert(x_str);
    options[(x0 + x1 - x2) * x3].insert(x_str);
    options[x0 + (x1 * x2 * x3)].insert(x_str);
    options[x0 + x1 * (x2 - x3)].insert(x_str);
    options[x0 + (x1 - x2) * x3].insert(x_str);
    options[x0 * (x1 + x2) + x3].insert(x_str);
    options[x0 * (x1 - x2 - x3)].insert(x_str);
    options[x0 * (x1 - x2 + x3)].insert(x_str);
    options[x0 * (x1 + x2 - x3)].insert(x_str);
    options[x0 * x1 - (x2 + x3)].insert(x_str);
    options[(x0 - x1) + x2 * x3].insert(x_str);
    options[x0 * (x1 + x2) * x3].insert(x_str);
    options[(x0 + x1) * x2 - x3].insert(x_str);
    options[x0 * (x1 + x2) - x3].insert(x_str);
    options[x0 * (x1 * x2 + x3)].insert(x_str);
    options[(x0 + x1) * (x2 - x3)].insert(x_str);
    options[(x0 - x1) * (x2 - x3)].insert(x_str);
  }
  set<string> output;
  for (map<long, set<string> >::iterator options_it = options.begin();
       options_it != options.end(); ++options_it) {
    long y = 0;
    long x = options_it->first;
    if (x < k) {
      y = k - x;
    } else {
      y = k + x;
    }
    if (y < 0 || y > 9999) continue;
    unsigned long y_remain = y;
    unsigned long y3 = y_remain % 10;
    y_remain /= 10;
    unsigned long y2 = y_remain % 10;
    y_remain /= 10;
    unsigned long y1 = y_remain % 10;
    y_remain /= 10;
    unsigned long y0 = y_remain % 10;
    string y_str = num_string(y0, y1, y2, y3);
    for (set<string>::iterator set_it = options_it->second.begin();
         set_it != options_it->second.end(); ++set_it) {
      output.insert(y_str + *set_it);
    }
    if (output.size() >= m) break;
  }
  unsigned long i = 0;
  for (set<string>::iterator output_it = output.begin();
       output_it != output.end(); ++output_it, i++) {
    if (i == m) break;
    cout << *output_it << endl;
  }
  return 0;
}
