#include <bits/stdc++.h>
using namespace std;
const int modulo = 1000000007;
int fastMax(int x, int y) { return (((y - x) >> (32 - 1)) & (x ^ y)) ^ y; }
int fastMin(int x, int y) { return (((y - x) >> (32 - 1)) & (x ^ y)) ^ x; }
vector<int> four[11111];
bool flag[11111][11111];
bool mm[111111111];
void solve1(int a, int cur) {
  if (a < 0) return;
  if (flag[a][cur] == false) return;
  flag[a][cur] = false;
  four[a].push_back(cur);
}
void solve2(int a, int b, int cur) {
  solve1(a * b, cur);
  solve1(a + b, cur);
  solve1(a - b, cur);
  solve1(b - a, cur);
  solve1(-a - b, cur);
}
void solve3(int a, int b, int c, int ans) {
  solve2(a + b, c, ans);
  solve2(a - b, c, ans);
  solve2(b - a, c, ans);
  solve2(a * b, c, ans);
  solve2(-a - b, c, ans);
  solve2(a, b + c, ans);
  solve2(a, b - c, ans);
  solve2(a, c - b, ans);
  solve2(a, b * c, ans);
  solve2(a, -b - c, ans);
}
void solve4(int a, int b, int c, int d, int ans) {
  solve3(a + b, c, d, ans);
  solve3(-a - b, c, d, ans);
  solve3(a - b, c, d, ans);
  solve3(b - a, c, d, ans);
  solve3(a * b, c, d, ans);
  solve3(a, -b - c, d, ans);
  solve3(a, b + c, d, ans);
  solve3(a, b - c, d, ans);
  solve3(a, c - b, d, ans);
  solve3(a, b, -c - d, ans);
  solve3(a, c * b, d, ans);
  solve3(a, b, c + d, ans);
  solve3(a, b, c - d, ans);
  solve3(a, b, d - c, ans);
  solve3(a, b, c * d, ans);
}
void solve(int ans) {
  int z1 = ans / 1000;
  int z2 = ans % 1000 / 100;
  int z3 = ans % 100 / 10;
  int z4 = ans % 10;
  solve4(z1, z2, z3, z4, ans);
}
void print(int value) {
  if (value < 1000) cout << "0";
  if (value < 100) cout << "0";
  if (value < 10) cout << "0";
  cout << value;
}
int main() {
  memset(flag, true, sizeof(flag));
  for (int i = 0; i <= 9999; i++) solve(i);
  for (int i = 0; i <= 9999; i++) four[i].push_back(i);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i <= 9999; i++) {
    int New = abs(n - i);
    for (int x = 0; x < four[i].size(); x++)
      for (int y = 0; y < four[New].size(); y++) {
        int value = four[i][x] * 10000 + four[New][y];
        if (mm[value]) continue;
        mm[value] = true;
        print(four[i][x]);
        print(four[New][y]);
        cout << endl;
        m--;
        if (m == 0) return 0;
      }
  }
  return 0;
  for (int i = 0; i <= 9999; i++) {
    if (four[i].size() == 0) continue;
    for (int j = 0; j <= 9999; j++) {
      if (four[j].size() == 0) continue;
      if (i + j != n && i - j != n && j - i != n && i * j != n) continue;
      for (int x1 = 0; x1 < four[i].size(); x1++)
        for (int x2 = 0; x2 < four[j].size(); x2++) {
          int value = four[i][x1] * 10000 + four[j][x2];
          if (mm[value] == true) continue;
          mm[value] = true;
          m--;
          print(four[i][x1]);
          print(four[j][x2]);
          cout << endl;
          if (m == 0) return 0;
        }
    }
  }
}
