#include <bits/stdc++.h>

#ifdef DEBUG
#define PRINT(x)\
    cout<<"func "<<__func__<<": line "<<__LINE__<<": "<<#x<<" = "<<(x)<<endl;
#define PRINTA(a,first,last)\
    cout<<"func "<<__func__<<": line "<<__LINE__<<": "<<#a<<"["<<(first)<<", "<<(last)<<")"<<endl;\
    for (int i=(first);i<(last);++i){cout<<#a<<"["<<i<<"] = "<<(a)[i]<<endl;}
#else
#define PRINT(x)
#define PRINTA(a,first,last)
#endif

using namespace std;

// return number of trailing zeros
int ntz(unsigned long long x)
{
    /*
    if (x == 0) {
        return -1;
    }*/
    int n = 1;
    if ((x & 0x00000000FFFFFFFFull) == 0) { n += 32; x >>= 32; }
    if ((x & 0x000000000000FFFFull) == 0) { n += 16; x >>= 16; }
    if ((x & 0x00000000000000FFull) == 0) { n +=  8; x >>=  8; }
    if ((x & 0x000000000000000Full) == 0) { n +=  4; x >>=  4; }
    if ((x & 0x0000000000000003ull) == 0) { n +=  2; x >>=  2; } 
    return n - (x & 1);
}

// return pow(n, d) % m
unsigned long long modpow(unsigned long long n, unsigned long long d, unsigned long long m)
{
    unsigned long long ret = 1;
    while (d) {
        if (d & 1) {
            ret = (ret * n) % m;
        }
        n = (n * n) % m;
        d >>= 1;
    }
    return ret;
}

bool miller_rabin(unsigned long long n, unsigned long long b)
{
    if (b % n == 0) {
        return true;
    }
    int s = ntz(n - 1);
    unsigned long long d = (n - 1) >> s;
    unsigned long long x = modpow(b, d, n);
    if (x == 1) {
        return true;
    }
    for (int i = 0; i < s; ++i) {
        if (x == n - 1) {
            return true;
        }
        x = (x * x) % n;
    }
    return false;
}

bool is_prime(unsigned long long n)
{
    if (n == 2) {
        return true;
    } else if (n % 2 == 0) {
        return false;
    }
    unsigned long long a[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
    for (int i = 0; i < 7; i++) {
        if (!miller_rabin(n, a[i])) {
            return false;
        }
    }
    return true;
}

// set primes < bound into [first, last).
// bound >= 3.
// distance(first, last) > 0.
// return value: the number of primes set in [first, last).
template <class Iterator>
int primes(int bound, Iterator first, Iterator last)
{
    Iterator it_push = first;
    *(it_push++) = 2;
    for (int n = 3; n < bound && it_push != last; n += 2) {
        bool is_prime = true;
        for (Iterator it = first; (*it) * (*it) <= n; ++it) {
            if (n % (*it) == 0) {
                is_prime = false;
                break;
            }
        }
        if (is_prime) {
            *(it_push++) = n;
        }
    }
    return distance(first, it_push);
}

// assume that [p_first, p_last) contains all primes p such that
// p * p <= n
template <class Iterator>
vector<pair<unsigned long long, int> > factorize(unsigned long long n, Iterator p_first, Iterator p_last)
{
    vector<pair<unsigned long long, int> >result;
    for (Iterator p = p_first; p != p_last; ++p) {
        if ((*p) * (*p) > n) {
            if (n > 1) {
                result.push_back(pair<unsigned long long, int>(n, 1));
            }
            break;
        }
        int count = 0;
        while (n % (*p) == 0) {
            n /= (*p);
            ++count;
        }
        if (count) {
            result.push_back(pair<unsigned long long, int>(*p, count));
            if (n == 1) {
                break;
            }
        }
    }
    return result;
}

int main(void)
{
    unsigned long long p[100000];
    int pi = primes(100000, p, p + 100000);
    int n;
    cin >> n;
    cout << n << ":";
    auto v = factorize(n, p, p + pi);
    for (auto e: v) {
        unsigned long long p = e.first;
        int count = e.second;
        while(count--) cout << " " << p;
    }
    cout << endl;
    return 0;
}


Measured memory_bytes: 3200