#include <bits/stdc++.h>
double eps = 1e-9;
using namespace std;
int arr[100002];
bool isprime(int x) {
  for (int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
      return false;
    }
  }
  return true;
}
int main() {
  std::ios::sync_with_stdio(false);
  int n;
  cin >> n;
  if (n < 4) {
    cout << 0;
    return 0;
  }
  vector<int> primes;
  vector<pair<int, int> > ans;
  arr[1] = -1;
  for (int i = 3; i <= n; i++) {
    if (isprime(i)) {
      if (i <= n / 2) {
        primes.push_back(i);
      } else {
        arr[i] = -1;
      }
    }
  }
  for (int i = 0; i < primes.size(); i++) {
    int x = primes[i];
    vector<int> candid;
    for (int j = 1; x * j <= n; j++) {
      if (arr[x * j] != -1) {
        candid.push_back(x * j);
      }
    }
    if (candid.size() % 2 == 0) {
      for (int j = 0; j < candid.size(); j += 2) {
        ans.push_back(make_pair(candid[j], candid[j + 1]));
        arr[candid[j]] = -1;
        arr[candid[j + 1]] = -1;
      }
    } else {
      ans.push_back(make_pair(candid[0], candid[2]));
      arr[candid[0]] = -1;
      arr[candid[2]] = -1;
      for (int j = 3; j < candid.size(); j += 2) {
        ans.push_back(make_pair(candid[j], candid[j + 1]));
        arr[candid[j]] = -1;
        arr[candid[j + 1]] = -1;
      }
    }
  }
  int counts = 0;
  int prev = -1;
  for (int i = 1; i <= n; i++) {
    if (arr[i] != -1) {
      counts++;
      if (counts == 2) {
        counts = 0;
        ans.push_back(make_pair(prev, i));
      } else {
        prev = i;
      }
    }
  }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].first << " " << ans[i].second << "\n";
  }
  return 0;
}
