#include <bits/stdc++.h>
#pragma GCC optimize(3)
inline void read(int &x) { scanf("%d", &x); }
inline void read(long long &x) { scanf("%I64d", &x); }
inline void read(double &x) { scanf("%lf", &x); }
inline void read(long double &x) {
  double tmp;
  read(tmp);
  x = tmp;
}
template <class T>
inline void read(T *a, int n) {
  for (int i = (0); i < (n); ++i) read(a[i]);
}
inline void write(int x) { printf("%d", x); }
inline void write(long long x) { printf("%I64d", x); }
inline void write(double x) { printf("%.10lf", x); }
inline void write(long double x) { printf("%.10lf", (double)x); }
template <class T>
inline void writeln(T x) {
  write(x);
  putchar('\n');
}
template <class T>
inline void writeln(T *a, int n) {
  for (int i = (0); i < (n); ++i) {
    write(a[i]);
    putchar(' ');
  }
  putchar('\n');
}
template <class T>
inline void writelnln(T *a, int n) {
  for (int i = (0); i < (n); ++i) writeln(a[i]);
}
int A[5];
std::set<int> res[5][5];
inline void calc(int l, int r) {
  std::set<int> &S = res[l][r];
  S.clear();
  if (l == r) {
    S.insert(A[l]);
    S.insert(-A[l]);
  } else {
    for (int m = (l); m < (r); ++m) {
      std::set<int> &a = res[l][m], &b = res[m + 1][r];
      for (__typeof(a.begin()) aa = a.begin(); aa != a.end(); ++aa)
        for (__typeof(b.begin()) bb = b.begin(); bb != b.end(); ++bb) {
          S.insert(*aa + *bb);
          S.insert(*aa - *bb);
          S.insert(*aa * *bb);
          S.insert(-*aa + *bb);
          S.insert(-*aa - *bb);
          S.insert(-*aa * *bb);
        }
    }
  }
}
std::set<int> ANS;
char buf[3000007], *cb = buf;
int main() {
  int k, m;
  read(k);
  read(m);
  for (int ls = (0); ls < (10000); ++ls) {
    A[0] = ls / 1000;
    A[1] = ls / 100 % 10;
    A[2] = ls / 10 % 10;
    A[3] = ls % 10;
    calc(0, 0);
    calc(1, 1);
    calc(2, 2);
    calc(3, 3);
    calc(0, 1);
    calc(1, 2);
    calc(2, 3);
    calc(0, 2);
    calc(1, 3);
    calc(0, 3);
    std::set<int> &ans = res[0][3];
    for (__typeof(ans.begin()) x = ans.begin(); x != ans.end(); ++x) {
      int ttt = abs(k - *x);
      if (ttt < 10000) {
        ANS.insert(ls * 10000 + ttt);
        if (ANS.size() == m) {
          for (__typeof(ANS.begin()) it = ANS.begin(); it != ANS.end(); ++it) {
            int x = *it;
            *(cb++) = x / 10000000 + '0';
            *(cb++) = x / 1000000 % 10 + '0';
            *(cb++) = x / 100000 % 10 + '0';
            *(cb++) = x / 10000 % 10 + '0';
            *(cb++) = x / 1000 % 10 + '0';
            *(cb++) = x / 100 % 10 + '0';
            *(cb++) = x / 10 % 10 + '0';
            *(cb++) = x % 10 + '0';
            *(cb++) = '\n';
          }
          fwrite(buf, 1, cb - buf, stdout);
          return 0;
        }
      }
    }
  }
  return 0;
}
