Today, Osama gave Fadi an integer X, and Fadi was wondering about the minimum possible value of max(a, b) such that LCM(a, b) equals X. Both a and b should be positive integers.

LCM(a, b) is the smallest positive integer that is divisible by both a and b. For example, LCM(6, 8) = 24, LCM(4, 12) = 12, LCM(2, 3) = 6.

Of course, Fadi immediately knew the answer. Can you be just like Fadi and find any such pair?

Input

The first and only line contains an integer X (1 ≤ X ≤ 10^{12}).

Output

Print two positive integers, a and b, such that the value of max(a, b) is minimum possible and LCM(a, b) equals X. If there are several possible such pairs, you can print any.

Examples

Input


2


Output


1 2


Input


6


Output


2 3


Input


4


Output


1 4


Input


1


Output


1 1
// package Div2613;

import javafx.util.Pair;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class ProblemC {
    public  static ArrayList<Pair<Long,Long>> solve(ArrayList<Long> a, int index,int f){
        long num=1;
        long max=Long.MAX_VALUE;
        ArrayList<Pair<Long,Long>> temp=new ArrayList<>();
        if(index>=a.size()){
            temp.add(new Pair<>(1l,1l));
            return temp;
        }
        ArrayList<Pair<Long,Long>> op1=solve(a,index+1,1);
        ArrayList<Pair<Long,Long>> op2=solve(a,index+1,2);
        if(f==1){
            for(int i=0;i<op1.size();i++){
                Pair<Long,Long> curr=op1.get(i);
                long s1=curr.getKey()*a.get(index);
                temp.add(new Pair<>(s1,curr.getValue()));
                Pair<Long,Long> curr2=op2.get(i);
                long s12=curr2.getKey()*a.get(index);
                temp.add(new Pair<>(s12,curr2.getValue()));
            }
        }
        else{
            for(int i=0;i<op1.size();i++){
                Pair<Long,Long> curr=op1.get(i);
                long s2=curr.getValue()*a.get(index);
                temp.add(new Pair<>(curr.getKey(),s2));
                Pair<Long,Long> curr2=op2.get(i);
                long s22=curr2.getValue()*a.get(index);
                temp.add(new Pair<>(curr2.getKey(),s22));
            }
        }
        return temp;
    }
    public static void main(String[] args)throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        long n=Long.parseLong(br.readLine());
        int seive[]=new int[1000001];
        ArrayList<Integer> primes=new ArrayList<>();
        for(int i=2;i<seive.length;i++){
            if(seive[i]==0){
                primes.add(i);
                for(int j=2*i;j<seive.length;j+=i){
                    seive[j]=1;
                }
            }
        }
        ArrayList<Long> a=new ArrayList<>();
//        a.add(1l);
        long temp=n;
        HashMap<Long,Integer> map=new HashMap<>();
        for(int i=0;i<primes.size();i++){
            int prime=primes.get(i);
            int count=0;
            while(temp%prime==0){
                temp/=prime;
                count++;
            }
            if(count!=0){
                map.put( (long)prime,count);
            }
            if(temp==1){
                break;
            }
        }
        if(temp!=1){
            map.put(temp,1);
        }
        if(map.size()==0||map.size()==1){
            System.out.println(n+" "+n);
            return;
        }
        for(long prime:map.keySet()){
            int pow=map.get(prime);
            long num=(long)Math.pow(prime,pow);
            a.add(num);
        }
//        System.out.println(map.toString());
//        System.out.println(a.toString());
        ArrayList<Pair<Long,Long>> ans1=solve(a,0,1);
        ArrayList<Pair<Long,Long>> ans2=solve(a,0,2);
//        System.out.println(ans1.size());
//        System.out.println(ans2.size());
        Pair<Long,Long> ans=new Pair<>(Long.MAX_VALUE,Long.MAX_VALUE);
        for(int i=0;i<ans1.size();i++){
            Pair<Long,Long> curr1=ans1.get(i);
            if(Math.max(curr1.getKey(),curr1.getValue())<Math.max(ans.getKey(),ans.getValue())){
                ans=curr1;
            }
            Pair<Long,Long> curr2=ans2.get(i);
            if(Math.max(curr2.getKey(),curr2.getValue())<Math.max(ans.getKey(),ans.getValue())){
                ans=curr2;
            }
        }
        System.out.println(ans.getKey()+" "+ans.getValue());
    }
}
