#include <bits/stdc++.h>
using namespace std;
int sv[100005];
int vis[100005];
vector<pair<int, int> > ans;
vector<int> pr[100005], st[100005];
void fill_seive(int n) {
  int i, j;
  for (i = 2; i <= n; i++) {
    if (sv[i] == 0) {
      for (j = 2 * i; j <= n; j += i) {
        sv[j] = 1;
      }
    }
  }
}
int main() {
  int n, i, j;
  scanf("%d", &n);
  fill_seive(n);
  for (i = 3; i <= n; i++) {
    if (sv[i] == 1) continue;
    for (j = i; j <= n; j += i) {
      if (!vis[j]) {
        st[i].push_back(j);
        vis[j] = 1;
      }
    }
    if (int(st[i].size()) % 2 && int(st[i].size()) > 1) {
      int sz = int(st[i].size());
      swap(st[i][1], st[i][sz - 1]);
      vis[st[i][sz - 1]] = 0;
    }
  }
  for (j = 2; j <= n; j += 2) {
    if (!vis[j]) {
      st[2].push_back(j);
      vis[j] = 1;
    }
  }
  for (i = 2; i <= n; i++) {
    if (sv[i] == 0) {
      for (j = 0; j + 1 < int(st[i].size()); j += 2)
        ans.push_back(make_pair(st[i][j], st[i][j + 1]));
    }
  }
  printf("%d\n", int(ans.size()));
  for (i = 0; i < int(ans.size()); i++) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
