import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

int[] sieve(int n) {
    assert(n > 1);
    auto t = new bool[n + 1];
    int[] primes = [2];
    for (int i = 3; i < t.length; i += 2) {
        if (!t[i]) {
            primes ~= i;
            for (int j = i + i; j < t.length; j += i)
                t[j] = true;
        }
    }
    return primes;
}

void main() {
    int n = readint;

    auto primes = sieve(cast(int)sqrt(n * 1.0));
    int[] facs;
    int x = n;
    foreach (prime; primes) {
        if (prime * prime > x) break;
        while (x % prime == 0) {
            facs ~= prime;
            x /= prime;
        }
    }

    if (x > 1) facs ~= x;
    writefln("%d: %s", n, facs.map!(to!string).join(" "));
}
