#include <bits/stdc++.h>
#pragma GCC optimize("O1")
using namespace std;
const long long MAXN = 2e5 + 5;
const long long MOD = 1e9 + 9;
long long power(long long x, long long y, long long m) {
  long long ans = 1;
  x = x % m;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) ans = (ans * x) % m;
    y = y >> 1;
    x = (x * x) % m;
  }
  return ans;
}
long long mod_inv(long long a, long long m) { return power(a, m - 2, m); }
long long mod_(long long a, long long m) { return (a + m) % m; }
long long add(long long a, long long b, long long m) {
  return (((a + b) % m) + m) % m;
}
long long sub(long long a, long long b, long long m) {
  return (((a - b) % m) + m) % m;
}
long long mul(long long a, long long b, long long m) {
  return (((a * b) % m) + m) % m;
}
long long div_(long long a, long long b, long long m) {
  return mul(a, mod_inv(b, m), m);
}
const long long N1 = 1;
long long f[N1], invf[N1];
void fact(long long M) {
  f[0] = f[1] = 1;
  for (int i = 2; i < N1; i++) f[i] = mod_(f[i - 1] * i, M);
  invf[N1 - 1] = power(f[N1 - 1], M - 2, M);
  for (int i = N1 - 1; i > 0; i--) invf[i - 1] = mod_(invf[i] * i, M);
}
long long nCr(long long n, long long r, long long M) {
  if (r > n) return 0;
  long long ans = f[n];
  ans = mod_(ans * invf[n - r], M);
  ans = mod_(ans * invf[r], M);
  return ans;
}
void fastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cout << fixed << setprecision(25);
  cerr << fixed << setprecision(10);
}
string reverse(string s) {
  int n = s.size();
  string ans = "";
  for (int i = n - 1; i >= 0; i--) {
    ans.push_back(s[i]);
  }
  return ans;
}
vector<long long> getHash(string &s, long long mod = MOD) {
  long long n = s.size(), pPow = 1;
  vector<long long> hash(n, 0);
  for (int i = 0; i < n; i++) {
    char c = s[i];
    hash[i] = ((c - 'a' + 1) * pPow) % mod;
    if (i > 0) hash[i] += hash[i - 1];
    pPow = (31 * pPow) % mod;
  }
  return hash;
}
int q;
long long n;
vector<long long> primes;
bool checkPrime() {
  if (n == 2) return true;
  if (n % 2 == 0) return false;
  for (int i = 3; i <= sqrt(n); i += 2) {
    if (n % i == 0) return false;
  }
  return true;
}
int gcd_one_case() {
  if (n % 2 == 0) {
    while (n > 0 && n % 2 == 0) {
      n /= 2;
    }
    if (n > 1)
      return -1;
    else
      return 2;
  }
  for (int i = 3; i <= sqrt(n); i += 2) {
    if (n % i == 0) {
      while (n > 0 && n % i == 0) {
        n /= i;
      }
      if (n > 1)
        return -1;
      else
        return i;
    }
  }
  return -1;
}
void solve() {
  cin >> n;
  bool b = checkPrime();
  if (b) {
    cout << n;
    cout << "\n";
  } else {
    int cse = gcd_one_case();
    if (cse > -1)
      cout << cse;
    else
      cout << 1;
    cout << "\n";
  }
}
int main() {
  fastIO();
  q = 1;
  while (q--) {
    solve();
  }
  return 0;
}

### Prompt

Construct a Cpp code solution to the problem outlined:

Ujan has been lazy lately, but now has decided to bring his yard to good shape. First, he decided to paint the path from his house to the gate.

The path consists of n consecutive tiles, numbered from 1 to n. Ujan will paint each tile in some color. He will consider the path aesthetic if for any two different tiles with numbers i and j, such that |j - i| is a divisor of n greater than 1, they have the same color. Formally, the colors of two tiles with numbers i and j should be the same if |i-j| > 1 and n mod |i-j| = 0 (where x mod y is the remainder when dividing x by y).

Ujan wants to brighten up space. What is the maximum number of different colors that Ujan can use, so that the path is aesthetic?

Input

The first line of input contains a single integer n (1 ≤ n ≤ 10^{12}), the length of the path.

Output

Output a single integer, the maximum possible number of colors that the path can be painted in.

Examples

Input


4


Output


2


Input


5


Output


5

Note

In the first sample, two colors is the maximum number. Tiles 1 and 3 should have the same color since 4 mod |3-1| = 0. Also, tiles 2 and 4 should have the same color since 4 mod |4-2| = 0.

In the second sample, all five colors can be used.

<image>

### Response

```cpp
#include <bits/stdc++.h>
#pragma GCC optimize("O1")
using namespace std;
const long long MAXN = 2e5 + 5;
const long long MOD = 1e9 + 9;
long long power(long long x, long long y, long long m) {
  long long ans = 1;
  x = x % m;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) ans = (ans * x) % m;
    y = y >> 1;
    x = (x * x) % m;
  }
  return ans;
}
long long mod_inv(long long a, long long m) { return power(a, m - 2, m); }
long long mod_(long long a, long long m) { return (a + m) % m; }
long long add(long long a, long long b, long long m) {
  return (((a + b) % m) + m) % m;
}
long long sub(long long a, long long b, long long m) {
  return (((a - b) % m) + m) % m;
}
long long mul(long long a, long long b, long long m) {
  return (((a * b) % m) + m) % m;
}
long long div_(long long a, long long b, long long m) {
  return mul(a, mod_inv(b, m), m);
}
const long long N1 = 1;
long long f[N1], invf[N1];
void fact(long long M) {
  f[0] = f[1] = 1;
  for (int i = 2; i < N1; i++) f[i] = mod_(f[i - 1] * i, M);
  invf[N1 - 1] = power(f[N1 - 1], M - 2, M);
  for (int i = N1 - 1; i > 0; i--) invf[i - 1] = mod_(invf[i] * i, M);
}
long long nCr(long long n, long long r, long long M) {
  if (r > n) return 0;
  long long ans = f[n];
  ans = mod_(ans * invf[n - r], M);
  ans = mod_(ans * invf[r], M);
  return ans;
}
void fastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cout << fixed << setprecision(25);
  cerr << fixed << setprecision(10);
}
string reverse(string s) {
  int n = s.size();
  string ans = "";
  for (int i = n - 1; i >= 0; i--) {
    ans.push_back(s[i]);
  }
  return ans;
}
vector<long long> getHash(string &s, long long mod = MOD) {
  long long n = s.size(), pPow = 1;
  vector<long long> hash(n, 0);
  for (int i = 0; i < n; i++) {
    char c = s[i];
    hash[i] = ((c - 'a' + 1) * pPow) % mod;
    if (i > 0) hash[i] += hash[i - 1];
    pPow = (31 * pPow) % mod;
  }
  return hash;
}
int q;
long long n;
vector<long long> primes;
bool checkPrime() {
  if (n == 2) return true;
  if (n % 2 == 0) return false;
  for (int i = 3; i <= sqrt(n); i += 2) {
    if (n % i == 0) return false;
  }
  return true;
}
int gcd_one_case() {
  if (n % 2 == 0) {
    while (n > 0 && n % 2 == 0) {
      n /= 2;
    }
    if (n > 1)
      return -1;
    else
      return 2;
  }
  for (int i = 3; i <= sqrt(n); i += 2) {
    if (n % i == 0) {
      while (n > 0 && n % i == 0) {
        n /= i;
      }
      if (n > 1)
        return -1;
      else
        return i;
    }
  }
  return -1;
}
void solve() {
  cin >> n;
  bool b = checkPrime();
  if (b) {
    cout << n;
    cout << "\n";
  } else {
    int cse = gcd_one_case();
    if (cse > -1)
      cout << cse;
    else
      cout << 1;
    cout << "\n";
  }
}
int main() {
  fastIO();
  q = 1;
  while (q--) {
    solve();
  }
  return 0;
}

```