#include <bits/stdc++.h>
using namespace std;
bool prime[(100000 + 5)], visit[(100000 + 5)];
void init() {
  memset(prime, true, sizeof(prime));
  memset(visit, false, sizeof(visit));
  for (int i = 2; i < (100000 + 5); ++i) {
    if (prime[i]) {
      for (int j = i * 2; j < (100000 + 5); j += i) prime[j] = false;
    }
  }
}
int main() {
  init();
  int n;
  cin >> n;
  vector<pair<int, int> > res;
  for (int i = n / 2; i >= 2; --i) {
    if (prime[i]) {
      vector<int> divisor;
      for (int j = i; j <= n; j += i) {
        if (!visit[j]) divisor.push_back(j);
      }
      if (divisor.size() % 2 != 0) {
        for (int j = 0; j < divisor.size(); ++j) {
          if (divisor[j] % 2 == 0) {
            swap(divisor[j], divisor.back());
            divisor.pop_back();
            break;
          }
        }
      }
      for (int j = 0; j < divisor.size(); j += 2) {
        res.push_back(make_pair(divisor[j], divisor[j + 1]));
        visit[divisor[j]] = true;
        visit[divisor[j + 1]] = true;
      }
    }
  }
  cout << res.size() << endl;
  for (int i = 0; i < res.size(); ++i)
    cout << res[i].first << " " << res[i].second << endl;
}
