#include <bits/stdc++.h>
using namespace std;
int n, s[100005], pr[100005];
vector<pair<int, int> > V;
vector<int> tmp;
int main() {
  scanf("%d", &n);
  memset(s, 0, sizeof(s));
  for (int i = (2); i <= (100000); i++) pr[i] = 1;
  for (int i = (3); i <= (n / 2); i++) {
    if (pr[i] && (i % 2)) {
      tmp.clear();
      for (int j = i; j <= n; j += i) {
        if (!s[j]) {
          tmp.push_back(j);
          pr[j] = 0;
        }
      }
      int sz = tmp.size();
      if (sz % 2 == 0) {
        for (int j = 0; j < sz; j += 2) {
          V.push_back(make_pair(tmp[j], tmp[j + 1]));
          s[tmp[j]] = 1;
          s[tmp[j + 1]] = 1;
        }
      } else if (sz > 2) {
        V.push_back(make_pair(tmp[0], tmp[2]));
        s[tmp[0]] = 1;
        s[tmp[2]] = 1;
        for (int j = 3; j < sz; j += 2) {
          V.push_back(make_pair(tmp[j], tmp[j + 1]));
          s[tmp[j]] = 1;
          s[tmp[j + 1]] = 1;
        }
      }
    }
  }
  tmp.clear();
  for (int j = 2; j <= n; j += 2)
    if (!s[j]) tmp.push_back(j);
  for (int i = 0; i + 1 < tmp.size(); i += 2) {
    V.push_back(make_pair(tmp[i], tmp[i + 1]));
  }
  printf("%d\n", (int)(V.size()));
  for (int i = (0); i <= ((int)(V.size()) - 1); i++)
    printf("%d %d\n", V[i].first, V[i].second);
  return 0;
}
