#include <bits/stdc++.h>
using namespace std;
#define MAXL (50000>>5)+1
#define GET(x) (mark[(x)>>5]>>((x)&31)&1)
#define SET(x) (mark[(x)>>5] |= 1<<((x)&31))
int mark[MAXL];
int P[5500], Pt = 0;
void sieve() {
register int i, j, k;
SET(1);
int n = 45825;
for(i = 2; i <= n; i++) {
if(!GET(i)) {
for(k = n/i, j = i*k; k >= i; k--, j -= i)
SET(j);
P[Pt++] = i;
}
}
}
vector< pair<int, int> > factor(int n) {
vector< pair<int, int> > R;
for(int i = 0, j; i < Pt && P[i] * P[i] <= n; i++) {
if(n%P[i] == 0) {
for(j = 0; n%P[i] == 0; n /= P[i], j++);
R.push_back(make_pair(P[i], j));
}
}
if(n != 1) R.push_back(make_pair(n, 1));
return R;
}
void gen_factor(int idx, int x, vector< pair<int, int> > &f, vector<int> &g) {
if (idx == f.size()) {
g.push_back(x);
return ;
}
for (int i = 0, a = 1; i <= f[idx].second; i++, a *= f[idx].first)
gen_factor(idx+1, x*a, f, g);
}
long long mpow(long long x, long long y, long long mod) {
long long ret = 1;
while (y) {
if (y&1)
ret = (ret * x)%mod;
y >>= 1, x = (x * x)%mod;
}
return ret % mod;
}
int primitive_root(int p) {
if (p == 2) return 1;
vector< pair<int, int> > f = factor(p-1);
vector<int> g;
gen_factor(0, 1, f, g);
g.erase(g.begin()), g.pop_back();
random_shuffle(g.begin(), g.end());
for (int i = 2; i <= p; i++) {
int ok = 1;
for (auto &x: g) {
if (mpow(i, x, p) == 1) {
ok = 0;
break;
}
}
if (ok) return i;
}
return -1;
}
int main() {
sieve();
int p;
while (scanf("%d", &p) == 1)
printf("%d\n", primitive_root(p));
return 0;
}