#include<iostream>
#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;

void seive(int r, vector<int> &spf) {
    vector<int> arr(r + 1, 1);
    spf.resize(r + 1);

    for (int i = 0; i <= r; i++) {
        spf[i] = i;
    }

    for (int i = 2; i <= r; i++) {
        if (arr[i] == 1) {
            ll j = (ll)i * i;

            while (j <= r) {
                if (spf[j] == j) {
                    spf[j] = i;
                }

                arr[j] = 0;
                j += i;
            }
        }
    }
}

unordered_map<ll, ll> factors(ll v, vector<int> &spf) {
    unordered_map<ll, ll> mpp;

    while (v != 1) {
        ll a = spf[v];
        mpp[a]++;
        v = v / a;
    }

    return mpp;
}

int main() {
    int r;
    cin >> r;

    vector<int> spf;
    seive(r, spf);

    ll v;
    cin >> v;

    unordered_map<ll, ll> mpp = factors(v, spf);

    for (auto it : mpp) {
        cout << it.first << "^" << it.second << " ";
    }

    return 0;
}
