#include <bits/stdc++.h>
using namespace std;
struct node {
  int a, b;
};
bool mp[100001];
int primer[100001];
int tmp[100001];
int n, m;
node res[100001];
int getPrimer(int n) {
  memset(mp, 0, sizeof(mp));
  int cnt = 0;
  for (int i = 2; i * i <= n; i++)
    if (!mp[i])
      for (int j = i * i; j <= n; j += i) mp[j] = 1;
  for (int i = 2; i <= n; i++)
    if (!mp[i]) primer[cnt++] = i;
  return cnt;
}
int main() {
  while (scanf("%d", &n) != EOF) {
    int cnt, ans;
    m = 0;
    cnt = getPrimer(n / 2);
    ans = 0;
    memset(mp, 0, sizeof(mp));
    for (int i = cnt - 1; i > 0; i--) {
      int s = 0, d = -1;
      for (int j = 1; j <= n / primer[i]; j++)
        if (!mp[primer[i] * j]) {
          if (j % 2 == 0) d = primer[i] * j;
          tmp[s++] = primer[i] * j;
        }
      if (s & 1) {
        for (int j = 0; j < s; j++) {
          if (tmp[j] == d) continue;
          res[m].a = tmp[j];
          mp[tmp[j]] = 1;
          j++;
          if (tmp[j] == d) j++;
          if (j >= s) break;
          res[m].b = tmp[j];
          mp[tmp[j]] = 1;
          m++;
        }
      } else {
        for (int j = 0; j < s;) {
          res[m].a = tmp[j];
          mp[tmp[j]] = 1;
          j++;
          res[m].b = tmp[j];
          mp[tmp[j]] = 1;
          j++;
          m++;
        }
      }
    }
    int p = 0;
    for (int i = 2; i <= n; i += 2)
      if (!mp[i]) tmp[p++] = i;
    if (p & 1) p--;
    for (int i = 0; i < p;) {
      res[m].a = tmp[i];
      i++;
      res[m].b = tmp[i];
      m++;
      i++;
    }
    printf("%d\n", m);
    for (int i = 0; i < m; i++) printf("%d %d\n", res[i].a, res[i].b);
  }
  return 0;
}
