#from statistics import median
#import collections
#aa = collections.Counter(a) # list to list || .most_common(2)で最大の2個とりだせるお a[0][0]
# from math import gcd
# from itertools import combinations,permutations,accumulate, product # (string,3) 3回
# #from collections import deque
# from collections import deque,defaultdict,Counter
# import decimal
# import re
# import math
# import bisect
# import heapq
#
#
#
# pythonで無理なときは、pypyでやると正解するかも！！
#
#
# my_round_int = lambda x:np.round((x*2 + 1)//2)
# 四捨五入g
#
# インデックス系
# int min_y = max(0, i - 2), max_y = min(h - 1, i + 2);
# int min_x = max(0, j - 2), max_x = min(w - 1, j + 2);
#
#
import sys
sys.setrecursionlimit(10000000)
mod = 10**9 + 7
#mod = 9982443453
#mod = 998244353
INF = float('inf')
from sys import stdin
readline = stdin.readline
def readInts():
  return list(map(int,readline().split()))
def readTuples():
    return tuple(map(int,readline().split()))
def I():
    return int(readline())
from math import gcd
def yaku(m):
    ans = []
    i = 1
    while i*i <= m:
        if m % i == 0:
            j = m // i
            ans.append(i)
            if j != i:
                ans.append(j)
        i += 1
    ans = sorted(ans)
    return ans
n = I()
lis = yaku(n)
#print(lis)
ln = len(lis)
#print((4 * 6)/gcd(4,6))
if n == 1:
    print(1, 1)
elif ln == 2:
    print(1, lis[-1])
else:
    if ln%2:
        cnt = 0
        while cnt < ln//2:
            if ((lis[ln//2 + cnt + 1] * lis[ln//2 - cnt -1]) // gcd(lis[ln//2 + cnt + 1], lis[ln//2 - cnt - 1])) == n:
                print(lis[ln//2 + cnt + 1], lis[ln//2 - cnt - 1])
                break
            else:
                cnt += 1
    else:
        cnt = 0
        while cnt < ln//2:
            if ((lis[ln//2 + cnt] * lis[ln//2 - cnt - 1]) // gcd(lis[ln//2 + cnt], lis[ln//2 - cnt - 1])) == n:
                print(lis[ln//2 + cnt], lis[ln//2 - cnt - 1])
                break
            else:
                cnt += 1
