#include <bits/stdc++.h>
using namespace std;
int const maxn = 1e5 + 10;
int n;
vector<pair<int, int> > ans;
vector<int> prime;
bool mrk[maxn], used[maxn];
int main() {
  scanf("%d", &n);
  mrk[1] = true;
  for (int i = 2; i * i <= maxn; i++)
    for (int j = i * i; j <= maxn; j += i) mrk[j] = true;
  used[1] = 1;
  for (int i = 3; i <= n / 2; i++)
    if (!mrk[i]) {
      prime.push_back(i);
      for (int j = 3 * i; j <= n; j += i)
        if (!used[j]) prime.push_back(j);
      if (prime.size() % 2 == 1 && 2 * i <= n && !used[2 * i])
        prime.push_back(2 * i);
      for (int j = 0; j < prime.size(); j += 2)
        ans.push_back(pair<int, int>(prime[j], prime[j + 1])),
            used[prime[j]] = 1, used[prime[j + 1]] = 1;
      prime.clear();
    }
  vector<int> a;
  for (int i = 2; i <= n; i += 2)
    if (!used[i]) a.push_back(i);
  for (int i = 0; i + 1 < a.size(); i += 2)
    ans.push_back(pair<int, int>(a[i], a[i + 1]));
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
