#include <bits/stdc++.h>
using namespace std;
int const N = 200000;
int n;
vector<pair<int, int> > result;
bool visit[N];
bool prime[N];
vector<int> primes;
inline void prepare() {
  for (int i = 2; i <= n; ++i) {
    if (!prime[i]) {
      primes.push_back(i);
    }
    for (int j = i + i; j <= n; j += i) {
      prime[j] = true;
    }
  }
}
int main() {
  scanf("%d", &n);
  prepare();
  for (__typeof(primes.begin()) it = primes.begin(); it != primes.end(); ++it) {
    int i = *it;
    if (i == 2) {
      continue;
    }
    if (i > n / 2) {
      break;
    }
    vector<int> num;
    for (int j = i + i + i; j <= n; j += i) {
      if (!visit[j]) {
        num.push_back(j);
      }
    }
    num.push_back(i);
    if ((int)num.size() & 1) {
      num.push_back(i + i);
    }
    for (int i = 0; i + 1 < (int)num.size(); i += 2) {
      result.push_back(make_pair(num[i], num[i + 1]));
      visit[num[i]] = visit[num[i + 1]] = true;
    }
  }
  vector<int> remain;
  for (int i = 1; i <= n; ++i) {
    if (!visit[i] && !(i & 1)) {
      remain.push_back(i);
    }
  }
  for (int i = 0; i + 1 < (int)remain.size(); i += 2) {
    result.push_back(make_pair(remain[i], remain[i + 1]));
  }
  printf("%d\n", (int)result.size());
  for (int i = 0; i < (int)result.size(); ++i) {
    printf("%d %d\n", result[i].first, result[i].second);
  }
  return 0;
}
