#include <bits/stdc++.h>
using namespace std;
int want, need;
map<int, set<int> > can1;
map<int, set<int> > can2;
map<int, set<int> > can4;
map<int, set<int> > can8;
void add(set<int> &a, int mult, set<int> &b, set<int> &c) {
  for (set<int>::iterator i = a.begin(); i != a.end(); ++i) {
    for (set<int>::iterator j = b.begin(); j != b.end(); ++j) {
      c.insert((*i) * mult + (*j));
      if (((int)(c).size()) >= need) return;
    }
  }
}
void makeall(map<int, set<int> > &a, int mult, map<int, set<int> > &b,
             map<int, set<int> > &c) {
  for (map<int, set<int> >::iterator i = a.begin(); i != a.end(); ++i) {
    for (map<int, set<int> >::iterator j = b.begin(); j != b.end(); ++j) {
      add(i->second, mult, j->second, c[i->first + j->first]);
      add(i->second, mult, j->second, c[abs(i->first - j->first)]);
      add(i->second, mult, j->second, c[i->first * j->first]);
    }
  }
}
void print(set<int> &a, int ndig, bool oneline, int cnt) {
  for (set<int>::iterator i = a.begin(); i != a.end(); ++i) {
    char now[10];
    memset(now, '0', sizeof(now));
    now[ndig] = '\0';
    for (int j = ndig - 1, x = *i; x != 0; x /= 10, --j) now[j] = '0' + x % 10;
    if (oneline) printf(" ");
    printf("%s", now);
    if (!oneline) puts("");
    if (cnt != -1 && --cnt == 0) return;
  }
}
void print(map<int, set<int> > &a, int ndig) {
  for (map<int, set<int> >::iterator i = a.begin(); i != a.end(); ++i) {
    printf("%d:", i->first);
    print(i->second, ndig, true, -1);
    puts("");
  }
}
void makewant(map<int, set<int> > &a, int mult, map<int, set<int> > &b,
              map<int, set<int> > &c) {
  for (map<int, set<int> >::iterator i = a.begin(); i != a.end(); ++i) {
    if (((int)(c[want]).size()) >= need) break;
    int test[10], ntest = 0;
    if (want >= i->first) test[ntest++] = want - i->first;
    test[ntest++] = want + i->first;
    if (want < i->first) test[ntest++] = i->first - want;
    if (i->first != 0 && want % i->first == 0) test[ntest++] = want / i->first;
    for (int j = (0); j < (ntest); ++j)
      add(i->second, mult, b[test[j]], c[want]);
  }
  if (want == 0)
    for (map<int, set<int> >::iterator j = b.begin(); j != b.end(); ++j) {
      if (((int)(c[want]).size()) >= need) break;
      add(a[0], mult, j->second, c[want]);
    }
}
void run(int casenr) {
  scanf("%d%d", &want, &need);
  for (int i = (0); i < (10); ++i) can1[i].insert(i);
  for (int i = (0); i < (100); ++i) can2[i].insert(i);
  for (int i = (0); i < (10000); ++i) can4[i].insert(i);
  makeall(can1, 10, can1, can2);
  makeall(can2, 100, can2, can4);
  makewant(can4, 10000, can4, can8);
  print(can8[want], 8, false, need);
}
int main() {
  run(1);
  return 0;
}
