#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
int n;
int cnt[MAXN + 10];
vector<int> lst[MAXN + 10];
vector<pair<int, int> > res;
bool vis[MAXN + 10];
bool cmp(int x, int y) { return cnt[x] < cnt[y]; }
bool notp[MAXN + 10];
int p[MAXN + 10], tot;
void GetP() {
  for (int i = 2; i <= MAXN; ++i) {
    if (!notp[i]) p[++tot] = i;
    for (int j = 1; j <= tot && p[j] * i <= MAXN; ++j) {
      notp[p[j] * i] = true;
      if (i % p[j]) break;
    }
  }
}
int main() {
  GetP();
  scanf("%d", &n);
  for (int i = 2; i <= n; ++i) {
    for (int j = i; j <= n; j += i) {
      ++cnt[j];
      lst[i].push_back(j);
    }
  }
  for (int i = 2; i <= n; ++i) {
    if (notp[i] || i == 2) continue;
    sort(lst[i].begin(), lst[i].end(), cmp);
    bool flag = false;
    int tmp;
    for (int j = 0; j != (int)lst[i].size(); ++j) {
      if (vis[lst[i][j]]) continue;
      if (flag)
        res.push_back(make_pair(tmp, lst[i][j])),
            vis[tmp] = vis[lst[i][j]] = true, flag = false;
      else
        tmp = lst[i][j], flag = true;
    }
  }
  for (int i = n; i > 1; --i) {
    if (!(notp[i] || i == 2)) continue;
    sort(lst[i].begin(), lst[i].end(), cmp);
    bool flag = false;
    int tmp;
    for (int j = 0; j != (int)lst[i].size(); ++j) {
      if (vis[lst[i][j]]) continue;
      if (flag)
        res.push_back(make_pair(tmp, lst[i][j])),
            vis[tmp] = vis[lst[i][j]] = true, flag = false;
      else
        tmp = lst[i][j], flag = true;
    }
  }
  printf("%u\n", res.size());
  for (int i = 0; i != (int)res.size(); ++i)
    printf("%d %d\n", res[i].first, res[i].second);
  return 0;
}
