#include <bits/stdc++.h>
using namespace std;
char buf;
inline int xint() {
  while (buf = getchar(), buf < '0' || buf > '9')
    ;
  int x = buf - '0';
  for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0')
    ;
  return x;
}
inline long long xll() {
  while (buf = getchar(), buf < '0' || buf > '9')
    ;
  long long x = buf - '0';
  for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0')
    ;
  return x;
}
inline string xstring() {
  while (buf = getchar(), buf == ' ' || buf == '\n')
    ;
  string x = "";
  for (x += buf; buf = getchar(), buf != ' ' && buf != '\n'; x += buf)
    ;
  return x;
}
const int MAXN = 100005;
vector<pair<int, int> > D;
int a[MAXN];
bool yep[MAXN], u[MAXN];
int main() {
  u[0] = u[1] = true;
  int N;
  cin >> N;
  for (int i = 2; i <= N; ++i) u[i] = yep[i] = false;
  for (int i = 2; i * i <= N; ++i) {
    for (int j = i * i; j <= N; j += i) u[j] = true;
  }
  for (int i = N; i > 1; --i) {
    if (u[i]) continue;
    int l = 0;
    for (int j = i; j <= N; j += i)
      if (!yep[j]) a[l++] = j;
    if (l % 2 == 1) {
      for (int j = 0; j < l; ++j)
        if (a[j] % 2 == 0) {
          a[j] = a[--l];
          break;
        }
    }
    for (int j = 0; j < l - 1; j += 2) {
      D.push_back(make_pair(a[j], a[j + 1]));
      yep[a[j]] = yep[a[j + 1]] = true;
    }
  }
  printf("%d\n", (int)D.size());
  for (auto i : D) printf("%d %d\n", i.first, i.second);
  return 0;
}
