#include <bits/stdc++.h>
using namespace std;
int Min(long long a, long long b) { return a > b ? b : a; }
long long x, k;
vector<long long> arr;
vector<long long> answer;
map<long long, vector<long long> > d;
void GetDiv(long long x) {
  int p = pow(x, 0.5) + 0.1;
  for (int i = 1; i <= p; i++) {
    long long div1 = i;
    if (!(x % div1)) {
      arr.push_back(div1);
      long long div2 = x / div1;
      if (div2 != div1) arr.push_back(div2);
    }
  }
  sort(arr.begin(), arr.end());
  for (int i = 0; i < ((int)arr.size()); i++) {
    vector<long long> cur;
    for (int j = 0; j <= i; j++) {
      if (!(arr[i] % arr[j])) cur.push_back(arr[j]);
    }
    d[arr[i]] = cur;
  }
}
bool IsPrime(vector<long long> &arr) {
  return ((int)arr.size()) > 2 ? false : true;
}
long long maxx = ((int)1e+5) + 5;
inline void rec(long long value, long long curK, long long &pos) {
  if (pos >= maxx || curK > k) return;
  map<long long, vector<long long> >::iterator it = d.find(value);
  bool prime = IsPrime((*it).second);
  if (prime) {
    if (value == 1) {
      answer.push_back(value);
      pos++;
      return;
    }
    long long step = k - curK;
    step = Min(step, (maxx - pos));
    for (int i = 0; i < step; i++) {
      answer.push_back(1);
      pos++;
    }
    answer.push_back(value);
    pos++;
    return;
  }
  for (int i = 0; i < ((int)(*it).second.size()); i++) {
    rec((*it).second[i], curK + 1, pos);
    if (curK == k - 1) {
      map<long long, vector<long long> >::iterator it1 =
          d.find((*it).second[i]);
      prime = IsPrime((*it1).second);
      if (!prime) {
        answer.push_back((*it).second[i]);
        pos++;
      }
    }
  }
}
int main() {
  cin >> x >> k;
  GetDiv(x);
  long long pos = 0;
  rec(x, 0, pos);
  if (k == 0) {
    cout << x;
    return 0;
  }
  int to = Min(((int)answer.size()), (int)1e+5);
  for (int i = 0; i < to; i++) printf("%I64d ", answer[i]);
  return 0;
}
