--{-# LANGUAGE OverloadedStrings #-}
--{-# LANGUAGE OverloadedLists   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns      #-} --引数に!
{-# LANGUAGE MultiWayIf        #-}
{-# LANGUAGE TupleSections     #-}

import Data.Bits
import Data.Foldable (foldlM,foldrM)
import Data.Maybe (fromJust)
import Data.List
import Data.Array  --変数衝突
import Data.Array.Unboxed
import Data.Array.MArray
import Data.Array.ST
import qualified Data.Vector.Unboxed as V
import Control.Monad
import Control.Monad.State
import Control.Monad.ST
import qualified Data.ByteString.Lazy.Char8 as B
import Debug.Trace

type Ans = String

-- h <= n <= w として
--4*h <= 3*N
--4*w >= 3*N

solve :: Int -> Ans
solve n = let
  infs = [max 1 (n`div`4)..3*(n+1)`div`4]
  sups = [3*n`div`4 .. 3500]
  ((h',n',w'):ans) = traceShowId {-find (\xs -> xs /= Nothing)-} [(h,h*w*n `div` (4*h*w-n*w-n*h),w) | h <- infs, w <- sups, 4*h*w-n*w-n*h /= 0, h*w*n `div` (4*h*w-n*w-n*h) > 0 ,h*w*n == (h*w*n `div` (4*h*w-n*w-n*h))*(4*h*w-n*w-n*h)]
  in (show h') ++ " " ++ (show n') ++ " " ++ (show w')

main :: IO ()
main = putStrLn . main0 =<< B.getContents

readBInt :: B.ByteString -> Int
readBInt = fst . fromJust . B.readInt

main0 :: B.ByteString -> Ans
main0 cont =
   let remLines0 = map B.words (B.lines cont)
       [n']:remLines1 = remLines0
       n = readBInt n'
   in solve n
