#include <bits/stdc++.h>
using namespace std;
const int N = 107;
int a[N], b[N];
int op(int x, int y, int _op) {
  if (_op == 1) return x + y;
  if (_op == 2) return x - y;
  return x * y;
}
void rm(vector<int> &vec) {
  sort(vec.begin(), vec.end());
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
}
vector<int> gao(int a[]) {
  vector<int> v, p, ret;
  for (int i = (0); i < (4); ++i)
    for (int j = (0); j < (4); ++j)
      for (int k = (0); k < (4); ++k) {
        b[0] = i, b[1] = j, b[2] = k;
        int x = a[0], y;
        v.clear(), p.clear();
        for (int j = (0); j < (3); ++j)
          if (b[j] == 0) {
            x = x * 10 + a[j + 1];
          } else {
            p.push_back(b[j]);
            v.push_back(x);
            x = a[j + 1];
          }
        v.push_back(x);
        if (((int)(v).size()) == 1) {
          ret.push_back(v[0]);
          continue;
        }
        if (((int)(v).size()) == 2) {
          ret.push_back(op(v[0], v[1], p[0]));
          continue;
        }
        if (((int)(v).size()) == 3) {
          x = op(v[0], v[1], p[0]);
          x = op(x, v[2], p[1]);
          ret.push_back(x);
          x = op(v[1], v[2], p[1]);
          x = op(v[0], x, p[0]);
          ret.push_back(x);
          continue;
        }
        x = op(v[0], v[1], p[0]);
        x = op(x, v[2], p[1]);
        x = op(x, v[3], p[2]);
        ret.push_back(x);
        x = op(v[0], v[1], p[0]);
        y = op(v[2], v[3], p[2]);
        x = op(x, y, p[1]);
        ret.push_back(x);
        x = op(v[1], v[2], p[1]);
        x = op(v[0], x, p[0]);
        x = op(x, v[3], p[2]);
        ret.push_back(x);
        x = op(v[1], v[2], p[1]);
        x = op(x, v[3], p[2]);
        x = op(v[0], x, p[0]);
        ret.push_back(x);
        x = op(v[2], v[3], p[2]);
        x = op(v[1], x, p[1]);
        x = op(v[0], x, p[0]);
        ret.push_back(x);
      }
  rm(ret);
  return ret;
}
vector<int> total;
map<int, set<int> > R;
int toInt(int a[]) {
  int ret = 0;
  for (int i = (0); i < (4); ++i) ret = ret * 10 + a[i];
  return ret;
}
void dfs(int t) {
  if (t >= 4) {
    vector<int> ret = gao(a);
    int x = toInt(a);
    for (int i = (0); i < (((int)(ret).size())); ++i) R[ret[i]].insert(x);
    return;
  }
  for (int i = (0); i < (10); ++i) {
    a[t] = i;
    dfs(t + 1);
  }
}
int k, m;
vector<int> ans;
set<int>::iterator it;
void add(set<int> &s1, set<int> &s2) {
  for (it = s2.begin(); it != s2.end(); ++it) s1.insert(*it);
}
void DFS(int t) {
  if (((int)(ans).size()) >= m) return;
  if (t >= 4) {
    vector<int> ret = gao(a);
    set<int> S;
    for (int i = (0); i < (((int)(ret).size())); ++i) {
      int x = ret[i];
      if (x <= k) {
        add(S, R[k - x]);
      } else {
        add(S, R[x - k]);
      }
    }
    int x = toInt(a);
    for (it = S.begin(); it != S.end(); ++it) ans.push_back(x * 10000 + *it);
    return;
  }
  for (int i = (0); i < (10); ++i) {
    a[t] = i;
    DFS(t + 1);
  }
}
int main() {
  dfs(0);
  scanf("%d%d", &k, &m);
  DFS(0);
  for (int i = (0); i < (m); ++i) printf("%.8d\n", ans[i]);
  return 0;
}
