#include <bits/stdc++.h>
using namespace std;
long long int min(long long int x, long long int y) {
  if (x < y) return x;
  return y;
}
long long int max(long long int x, long long int y) {
  if (x > y) return x;
  return y;
}
long long int maxx(long long int x, long long int y, long long int z) {
  return max(x, max(y, z));
}
long long int isset(long long int n, long long int k) {
  if ((n >> (k)) & 1) return 1;
  return 0;
}
template <typename T>
bool cmp(const pair<long long int, long long int> &a,
         const pair<long long int, long long int> &b) {
  if (a.first != b.first)
    return a.first < b.first;
  else
    return a.second < b.second;
}
inline bool is_palindrome(const string &s) {
  return std::equal(s.begin(), s.end(), s.rbegin());
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long int n;
  cin >> n;
  unordered_map<long long int, long long int> m;
  long long int z = n;
  while (z % 2 == 0) {
    m[2]++;
    z /= 2;
  }
  for (long long int i = 3; i * i <= z; i += 2) {
    while (z % i == 0) {
      m[i]++;
      z /= i;
    }
  }
  if (z > 2) m[z]++;
  vector<long long int> ans;
  ans.push_back(1);
  for (auto k : m) {
    ans.push_back(k.first);
  }
  long long int p = 1;
  m[1] = 1;
  vector<pair<long long int, long long int>> l;
  for (long long int i = 0; i < ans.size() - 1; i++) {
    p = p * ans[i] * m[ans[i]];
    long long int p2 = n / p;
    l.push_back({p, p2});
  }
  long long int mx = INT_MAX;
  ;
  pair<long long int, long long int> sri;
  for (auto k : l) {
    if (mx > max(k.first, k.second)) {
      sri.first = k.first, sri.second = k.second;
    }
  }
  cout << sri.first << ' ' << sri.second << '\n';
  return 0;
}
