#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ld = long double;

#define all(x)  x.begin(),x.end()
#define v(x) vector<x>
#define nl '\n'
#define fxd(x) fixed << setprecision(x)
template<class t> using ordered_set = tree<t, null_type, less<t>, rb_tree_tag, tree_order_statistics_node_update>;
template<class t> using ordered_multiset = tree<t, null_type, less_equal<t>, rb_tree_tag, tree_order_statistics_node_update>;

//        pow|base
vector<ll> primefactors(ll n)
{
    vector<ll> res;
    for (int i = 2; i*i <= n; i++)
    {
        
        while (n%i == 0)
        {
            
            res.push_back(i);
            n /= i;
        }
    }
    if(n > 1) res.push_back(n);
    return res;
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    ll n , k; cin >> n >> k;
    vector<ll> pm = primefactors(n);

    if(pm.size() < k)
    {
        cout << -1;
    }
    else
    {
        for (int i = 0; i < k-1; i++)
        {
            cout << pm[i] << " ";
        }
        ll res = 1;
        for (int i = k-1; i < pm.size(); i++)
        {
            res *= pm[i];
        }
        cout << res;
        
    } 
}