import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
//我们每次都把 n 除以一个质因数 p,直到不能整除为止。
// 最后剩下的 n 如果大于 1,那它一定是质数(否则它会有更小的质因数,但我们已经除尽了所有小于 √n 的质因数)。
// 所以最终所有质因数的乘积一定等于原 n。
// 试除法天然过滤了合数
// 假设 n 能被合数 c 整除,比如 c = 9 = 3×3。
// 那么在试除到 c 之前,我们已经试过 3,并且把 n 中所有的 3 都除掉了。
// 所以当轮到 c=9 时,n 已经不包含因子 3,自然也不能被 9 整除。
// 我们每次都把 n 除以一个质因数 p,直到不能整除为止。
// 最后剩下的 n 如果大于 1,那它一定是质数(否则它会有更小的质因数,但我们已经除尽了所有小于 √n 的质因数)。
// 所以最终所有质因数的乘积一定等于原 n。
//c#代码
// long n = long.Parse(Console.ReadLine());
// List<long> primeFactors = new List<long>();
// // 1. 处理因数 2
// while (n % 2 == 0) {
// primeFactors.Add(2);
// n /= 2;
// }
// // 2. 处理奇数因数(从 3 开始,每次 +2)
// for (long i = 3; i * i <= n; i += 2) {
// while (n % i == 0) {
// primeFactors.Add(i);
// n /= i;
// }
// }
// // 3. 如果 n 还大于 1,说明它本身是质数
// if (n > 1) {
// primeFactors.Add(n);
// }
// // 输出结果
// Console.WriteLine(string.Join(" ", primeFactors));
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
for (long i = 2; i * i <= n; i++) {
while (n % i == 0) {
System.out.print(i + " ");
n /= i;
}
}
if (n > 1) {
System.out.print(n + " ");
}
System.out.println();
}
}