#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000,100000000000")
const long long INF = 1000000007;
const long double cp = 2 * asin(1.0);
const long double eps = 1e-9;
const long long mod = 1000000007;
using namespace std;
int main() {
  int n;
  vector<int> ans;
  cin >> n;
  char used[100001], prost[100001];
  for (int(i) = (2); (i) <= (n); i++) {
    if (!prost[i]) {
      int j = i + i;
      while (j <= n) prost[j] = true, j += i;
    }
  }
  for (int(i) = (n); (i) >= (2); i--) {
    if (!prost[i]) {
      int j = i;
      vector<int> s;
      while (j <= n) {
        if (!used[j]) {
          s.push_back(j);
          used[j] = true;
        }
        j += i;
      }
      if (s.size() % 2) {
        if (s.size() == 1) continue;
        s.erase(s.begin() + 1);
        used[i + i] = false;
      }
      for (int(i) = 0; (i) < (s.size()); i++) ans.push_back(s[i]);
    }
  }
  cout << ans.size() / 2 << endl;
  int i = 0;
  while (i < ans.size()) {
    cout << ans[i] << ' ' << ans[i + 1] << endl;
    i += 2;
  }
  return 0;
}
