#include <bits/stdc++.h>
using namespace std;
const int N = 100001;
int f[N];
vector<int> prime, a[N];
vector<pair<int, int> > ans;
int n;
int minDivide(int x) {
  while (x != 1) {
    if (f[x] == 2)
      x /= f[x];
    else
      return f[x];
  }
  return 2;
}
int main() {
  memset(f, 0, sizeof(f));
  for (int i = 2; i < N; ++i) {
    if (f[i] == 0)
      for (int j = 1; j < N; ++j) {
        if (1ll * i * j >= N) break;
        if (f[i * j] == 0) f[i * j] = i;
      }
  }
  scanf("%d", &n);
  for (int i = 2; i <= n; ++i) {
    int dv = minDivide(i);
    a[dv].push_back(i);
  }
  int pos;
  for (int i = 3; i <= n / 2; ++i) {
    if (a[i].size() > 0) {
      swap(a[i][0], a[i][1]);
      pos = 0;
      if (a[i].size() % 2 == 1) pos = 1;
    }
    for (int j = pos; j < a[i].size(); j += 2)
      ans.push_back(make_pair(a[i][j], a[i][j + 1]));
    if (pos == 1 && a[i].size() > 0) a[2].push_back(a[i][0]);
  }
  if (a[2].size() % 2 == 0)
    pos = 0;
  else
    pos = 1;
  for (int i = pos; i < a[2].size(); i += 2)
    ans.push_back(make_pair(a[2][i], a[2][i + 1]));
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); ++i) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
