#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
bool mark[MAXN], mark2[MAXN];
vector<int> ezaf;
vector<pair<int, int> > answer;
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    return cout << 0 << endl, 0;
  }
  int ans = 0;
  for (int i = 2; i <= n; i++) {
    for (int j = 2 * i; j <= n; j += i) {
      mark2[j] = true;
    }
  }
  for (int i = 3; i <= n; i++) {
    vector<int> f;
    if (mark[i] == true or mark2[i] == true) {
      continue;
    }
    f.push_back(i);
    int cnt = 1;
    int last = -1;
    for (int j = 2 * i; j <= n; j += i) {
      if (mark[j] == true) {
        continue;
      }
      mark[j] = true;
      cnt++;
      f.push_back(j);
      last = j;
    }
    if (cnt == 1) {
      continue;
    }
    if (cnt % 2 == 1) {
      ezaf.push_back(f[1]);
      f.erase(f.begin() + 1);
      cnt--;
    }
    for (int j = 0; j < cnt - 1; j += 2) {
      answer.push_back(make_pair(f[j], f[j + 1]));
    }
    ans += cnt / 2;
  }
  for (int i = 2; i <= n; i += 2) {
    if (mark[i] == false) {
      ezaf.push_back(i);
    }
  }
  cout << ans + (ezaf.size() / 2) << endl;
  for (int i = 0; i < answer.size(); i++) {
    cout << answer[i].first << ' ' << answer[i].second << endl;
  }
  for (int i = 0; i < ezaf.size() - 1; i += 2) {
    cout << ezaf[i] << ' ' << ezaf[i + 1] << endl;
  }
}
