#include <bits/stdc++.h>
inline constexpr int ctoi(const char c) { return c - '0'; }
inline constexpr char itoc(const int n) { return n + '0'; }
template <typename T>
inline T clamp(const T& n, const T& lo, const T& hi) {
  return std::max(lo, std::min(n, hi));
}
template <class T>
inline void sort(T& a) {
  std::sort(a.begin(), a.end());
}
template <class T1, class T2>
inline void sort(T1& a, T2 comp) {
  sort(a.begin(), a.end(), comp);
}
template <class T>
inline int read(T& n) {
  return std::cin >> n ? 1 : -1;
}
template <typename T, typename... types>
inline int read(T& n, types&... args) {
  return read(n) == -1 ? -1 : read(args...) + 1;
}
template <class T>
inline void write(const T& n) {
  std::cout << n;
}
template <typename T, typename... types>
inline void write(const char sep, T& n, types&... args) {
  write(n);
  write(sep);
  write(sep, args...);
}
template <typename T>
inline constexpr bool odd(const T a) {
  return bool(a & 1);
}
template <typename T>
inline constexpr bool even(const T a) {
  return !odd(a);
}
template <class T>
inline unsigned int mod(const T m, const T n) {
  return m >= 0 ? m % n : (n - abs(m % n)) % n;
}
template <class T>
class reader {
 public:
  void operator()(T& t) const { std::cin >> t; }
};
template <class CONTAINER, class READ_Fn>
void read(CONTAINER& v, const unsigned int size,
          const READ_Fn& rfn = reader<typename CONTAINER::value_type>()) {
  for (int i = 0; i < size; ++i) {
    rfn(v[i]);
  }
}
auto pair_cmp = [](const std::pair<signed long, signed long>& p1,
                   const std::pair<signed long, signed long>& p2) {
  return (p1.first < p2.first) ||
         (p1.first == p2.first && p1.second < p2.second);
};
template <class T>
T ipow(T base, T exp) {
  T result = 1;
  while (exp) {
    if (exp & 1) result *= base;
    exp >>= 1;
    base *= base;
  }
  return result;
}
void getPrimesSieve(std::vector<long long>& primes, const long long n) {
  std::vector<bool> nums(n + 1, true);
  primes.push_back(2);
  for (signed long long i = 3; i * i < n + 1; i += 2) {
    if (nums[i]) {
      for (signed long long j = i * i; j < n + 1; j += 2 * i) {
        nums[j] = false;
      }
    }
  }
  for (signed long long i = 3; i <= n; i += 2)
    if (nums[i]) primes.push_back(i);
}
using namespace std;
constexpr const int SIZE = 100000;
template <class T>
void factorize(T num, vector<int>& factors) {
  vector<long long> primes;
  getPrimesSieve(primes, SIZE);
  for (int i = 0; i < primes.size() && num > 1;) {
    if (num % primes[i] == 0) {
      num /= primes[i];
      factors.push_back(primes[i]);
    } else
      i++;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  long long N;
  read(N);
  int k;
  read(k);
  vector<int> factors;
  factorize(N, factors);
  int size = factors.size() / k;
  if (size <= 0) {
    cout << -1 << endl;
  } else {
    for (int i = 0; i < k - 1; ++i) {
      long long a = 1;
      for (int j = i * size; j < (i + 1) * (size); j++) {
        a *= factors[j];
      }
      cout << a << " ";
    }
    long long a = 1;
    for (int j = (k - 1) * size; j < factors.size(); j++) {
      a *= factors[j];
    }
    cout << a << " ";
    cout << endl;
  }
  return 0;
}
