#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T a, T b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
template <typename P>
P dectobin(P a) {
  if (a == 0)
    return 0;
  else
    return (a % 2 + 10 * dectobin(a / 2));
}
template <typename Y>
Y bintodec(Y a) {
  long long ans = 0, b = 1, t = a;
  while (t) {
    long long ld = t % 10;
    t /= 10;
    ans += ld * b;
    b = b * 2;
  }
  return ans;
}
template <typename H>
H modExp(H x, H n) {
  long long r = 1;
  while (n > 0) {
    if (n % 2 == 1) {
      r = (r * x) % 1000000007;
    }
    x = (x * x) % 1000000007;
    n /= 2;
  }
  return r;
}
template <typename T>
T isPowerOfTwo(T x) {
  return x && (!(x & (x - 1)));
}
template <typename T>
T lcm(T a, T b) {
  return a * b / gcd(a, b);
}
const long long n = 10004;
bool prime[n + 1];
void sieve() {
  memset(prime, true, sizeof(prime));
  for (long long p = 2; p * p <= n; p++) {
    if (prime[p] == true) {
      for (long long i = p * p; i <= n; i += p) prime[i] = false;
    }
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ostream_iterator<long long> output(cout, " ");
  long long m;
  cin >> m;
  sieve();
  if (m == 2)
    cout << -1;
  else if (prime[m] == true) {
    cout << m << '\n';
    for (long long(i) = (1); i < (m); i++) {
      cout << i << " " << i + 1 << '\n';
    }
    cout << 1 << " " << m;
  } else {
    long long p = 0;
    for (long long(i) = (m + 1); i < (1050); i++) {
      if (prime[i] == true) {
        p = i;
        break;
      }
    }
    long long k = p - m;
    cout << p << '\n';
    for (long long(i) = (1); i < (m); i++) {
      cout << i << " " << i + 1 << '\n';
    }
    cout << 1 << " " << m << '\n';
    long long t = 1;
    while (k--) {
      cout << t << " " << t + m / 2 << '\n';
      t++;
    }
  }
  return 0;
}
