#include <bits/stdc++.h>
using namespace std;
template <class T>
void rd(T &x) {
  int f = 1;
  x = 0;
  char c;
  while (c = getchar(), !isdigit(c))
    if (c == '-') f = -1;
  do x = (x << 3) + (x << 1) + (c ^ 48);
  while (c = getchar(), isdigit(c));
  x *= f;
}
const int N = 5e4 + 5;
int pri[N / 9], cnt, n;
bool vis[N], ins[N << 1];
void sieve(int n) {
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) pri[++cnt] = i;
    for (int j = 1; i * pri[j] <= n && j <= cnt; j++) {
      vis[i * pri[j]] = 1;
      if (i % pri[j] == 0) break;
    }
  }
  return;
}
vector<pair<int, int> > ans;
int main() {
  rd(n);
  sieve(n / 2);
  for (int i = cnt; i > 0; i--) {
    int tot = 0;
    for (int j = pri[i]; j <= n; j += pri[i]) tot += !ins[j];
    if (tot & 1) {
      int bef, tot = 0;
      for (int j = pri[i]; j <= n; j += pri[i])
        if (!ins[j] && j / pri[i] != 2) {
          ins[j] = 1;
          tot++;
          if (tot & 1)
            bef = j;
          else
            ans.push_back({bef, j});
        }
    } else {
      int bef, tot = 0;
      for (int j = pri[i]; j <= n; j += pri[i])
        if (!ins[j]) {
          ins[j] = 1;
          tot++;
          if (tot & 1)
            bef = j;
          else
            ans.push_back({bef, j});
        }
    }
  }
  cout << ans.size() << endl;
  for (auto it : ans) cout << it.first << ' ' << it.second << endl;
  return 0;
}
