#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int match[maxn];
int ans, n;
bool is_prime(int x) {
  bool mark = true;
  for (int i = 2; i * i <= x; i++)
    if (x % i == 0) mark = false;
  return mark;
}
int main() {
  cin >> n;
  memset(match, -1, sizeof match);
  for (int i = (n / 2); i > 1; i--)
    if (is_prime(i)) {
      vector<int> v;
      for (int j = i; j <= n; j += i)
        if (match[j] == -1) v.push_back(j);
      if ((int)v.size() % 2 == 0) {
        for (int j = 0; j < (int)v.size(); j += 2) {
          match[v[j]] = v[j + 1];
          match[v[j + 1]] = v[j];
          ans++;
        }
      } else if (v.size() > 2) {
        match[v[0]] = v[2];
        match[v[2]] = v[0];
        ans++;
        for (int j = 3; j < (int)v.size(); j += 2) {
          match[v[j]] = v[j + 1];
          match[v[j + 1]] = v[j];
          ans++;
        }
      }
    }
  cout << ans << endl;
  for (int i = 1; i <= n; i++)
    if (match[i] > i) {
      cout << i << ' ' << match[i] << endl;
    }
  return 0;
}
