#include <bits/stdc++.h>
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
#define pr(...) GET_MACRO(__VA_ARGS__,pr6,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__)
#define Pr(a) (#a)<<"="<<(a)<<" "
#define pr1(a) cerr<<Pr(a)<<endl;
#define pr2(a,b) cerr<<Pr(a)<<Pr(b)<<endl;
#define pr3(a,b,c) cerr<<Pr(a)<<Pr(b)<<Pr(c)<<endl;
#define pr4(a,b,c,d) cerr<<Pr(a)<<Pr(b)<<Pr(c)<<Pr(d)<<endl;
#define pr5(a,b,c,d,e) cerr<<Pr(a)<<Pr(b)<<Pr(c)<<Pr(d)<<Pr(e)<<endl;
#define pr6(a,b,c,d,e,f) cerr<<Pr(a)<<Pr(b)<<Pr(c)<<Pr(d)<<Pr(e)<<Pr(f)<<endl;
#define int long long
#define double long double
using namespace std;
const int N = 100010;
const int INF = 1LL<<55;
const int mod = (1e9)+7;
const double EPS = 1e-8;
const double PI = 6.0 * asin(0.5);
typedef pair<int,int> P;
typedef long long ll;
template<class T> T Max(T &a,T b){return a=max(a,b);}
template<class T> T Min(T &a,T b){return a=min(a,b);}
ostream& operator<<(ostream& o,P p){return o<<"("<<p.first<<","<<p.second<<")";}
istream& operator>>(istream& i,P &p){return i>>p.first>>p.second;}
ostream& operator<<(ostream& o,vector<auto> &a){int i=0;for(auto t:a)o<<(i++?" ":"")<<t;return o;}
istream& operator>>(istream& i,vector<auto> &a){for(auto &t:a)i>>t;return i;}
void prArr(auto a,string s=" "){int i=0;for(auto t:a)cout<<(i++?s:"")<<t;cout<<endl;}

template <typename T>
class Pollards_Rho{

public:
  
  typedef long long ll;
  
  Pollards_Rho(){}
  
  T mod_pow(T x, T n, T mod){
    T res = 1;
    while( n != 0 ){
      if( n % 2 != 0 ) res = res * x % mod;
      x = x * x % mod;
      n /= 2;
    }
    return res;
  }
  
  T Rand(){
    random_device rd;
    T a = rd(), b = rd();
    return a * b;
  }
  
  // ミラーラビンによる素数判定
  bool miller_rabin(T n){
    if( n == 2 ) return true;
    if( n == 1 || n % 2 == 0 ) return false;
    T s = 0, d = n - 1;
    
    while( d % 2 == 0 ) s++, d /= 2;
    T cnt = 20;
    while( cnt-- != 0 ){
      random_device rd;
      T a = Rand() % ( n - 1 );
      a++;
      T t = d;
      T y = mod_pow( a, t, n );
      while( t != n - 1 && y != 1 && y != n - 1 ){
	y = ( y * y ) % n;
	t *= 2;
      }
      if( y != n - 1 && t % 2 == 0 ) return false;
    }
    return true;
  }
  
  // nを法とする擬似乱数発生関数
  T f(T x, T n){
    T c = 5;
    return ( x * x + c ) % n;
  }
  
  T Abs(T x){
    if( x < 0 ) x *= -1;
    return x;
  }
  
  T min(T A, T B){
    if( A < B ) return A;
    return B;
  }
  
  // ポラード・ローによる素因数探し（素でない因数を見つける場合もある）
  T pollards_rho(T n){
    random_device rd;
    T A = Rand();
    T y = A % ( n + 1 );
    T r = 1, q = 1, m = rand() + 1;
    T g, ys, x;
    do{
      x = y;
      for(T i=1;i<=r;++i) y = f( y, n );
      T k = 0;
      do{
	ys = y;
	for(T i=1;i<=min( m, r - k );++i){
	  y = f( y, n );
	  q = ( q * Abs( x - y ) ) % n;
	}
	g = __gcd( q, n );
	k = k + m;
      }
      while( k < r && g <= 1 );
      r = r * 2;
    }
    while( g <= 1 );
    if( g == n ){
      do{
	ys = f( ys, n );
	g = __gcd( (T)Abs( x - ys ), n );
      }
      while( g <= 1 );
    }
    return g;
  }
  
  // nを素因数分解し、ソートして返す
  vector<T> factor(T n){
    assert( n > 1 );
    vector<T> res;
    while( miller_rabin(n) == false ){
      T r = pollards_rho(n);
      if( r > 1 && r < n && miller_rabin(r) == true ){
	res.push_back( r );
	n /= r;
      }
    }
    if( n != 1 ) res.push_back( n );
    sort( res.begin(), res.end() );
    return res;
  }
  
};

ostream& operator<<(ostream &dest, __int128_t value) {
  std::ostream::sentry s(dest);
  if (s) {
    __uint128_t tmp = value < 0 ? -value : value;
    char buffer[128];
    char *d = std::end(buffer);
    do {
      --d;
      *d = "0123456789"[tmp % 10];
      tmp /= 10;
    } while (tmp != 0);
    if (value < 0) {
      --d;
      *d = '-';
    }
    int len = std::end(buffer) - d;
    if (dest.rdbuf()->sputn(d, len) != len) {
      dest.setstate(std::ios_base::badbit);
    }
  }
  return dest;
}

__int128_t parse(string s) {
  __int128_t res = 0;
 for(char ch:s) if(isdigit(ch)) res = res * 10 + ch - '0';
 if(s[0] == '-') res *= -1;
 return res;
}

istream& operator>>(istream &is, __int128_t &value){
  string s;
  is>>s;
  value = parse(s);
  return is;
}

string to_string(__int128_t value){
  if(value == 0) return "0";
  string s;
  while(value){
    s += char(value % 10 + '0');
    value /= 10;
  }
  reverse(s.begin(),s.end());
  return s;
}

signed main(){
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  using Int = __int128_t;  
  
  Int n;
  cin>>n;
  Pollards_Rho<Int> A;
  
  auto ans = A.factor(n);
  cout<<n<<": ";
  cout<<ans<<endl;  
  
  return 0;
}



Measured memory_bytes: 3224