#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10001;
string extend(string s, int len) {
  while (int(s.size()) < len) s = "0" + s;
  return s;
}
map<string, vector<int> > dp;
vector<string> p[MAXN];
vector<int> get(string s) {
  if (dp.count(s)) return dp[s];
  if (s.size() == 1) return vector<int>(1, s[0] & 0xf);
  set<int> ans;
  ans.insert(atoi(s.c_str()));
  for (int l = 0; l < (int)(s.size() - 1); l++) {
    vector<int> a1 = get(s.substr(0, l + 1));
    vector<int> a2 = get(s.substr(l + 1));
    for (int i = 0; i < (int)(a1.size()); i++) {
      for (int j = 0; j < (int)(a2.size()); j++) {
        ans.insert(a1[i] - a2[j]);
        ans.insert(a2[j] - a1[i]);
        ans.insert(a1[i] + a2[j]);
        ans.insert(a1[i] * a2[j]);
      }
    }
  }
  return dp[s] = vector<int>(ans.begin(), ans.end());
}
string toStr(int x) {
  stringstream ss;
  ss << x;
  string ret;
  ss >> ret;
  return ret;
}
int main() {
  for (int i = 0; i < (int)(10000); i++) {
    string s = extend(toStr(i), 4);
    vector<int> a = get(s);
    for (int j = 0; j < (int)(a.size()); j++) {
      if (0 <= a[j] && a[j] < MAXN) p[a[j]].push_back(s);
    }
  }
  int s, m;
  cin >> s >> m;
  set<string> ans;
  for (int x = 0; x < (int)(s + 1); x++) {
    int y = s - x;
    for (int i = 0; i < (int)(p[x].size()); i++) {
      for (int j = 0; j < (int)(p[y].size()); j++) {
        ans.insert(p[x][i] + p[y][j]);
        if (int(ans.size()) == m) {
          for (__typeof((ans).begin()) itr = (ans).begin(); itr != (ans).end();
               itr++)
            puts((*itr).c_str());
          return 0;
        }
      }
    }
  }
  return -1;
}
