#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.2")
using namespace std;
inline void opting() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
}
long long inp() {
  long long x;
  cin >> x;
  return x;
}
void make_unique(vector<long long> &vec, bool sorted = false) {
  if (!sorted) sort((vec).begin(), (vec).end());
  vec.resize(unique((vec).begin(), (vec).end()) - vec.begin());
}
void file_edit(bool reader = true, bool writer = false) {
  if (reader) freopen("Test_input.txt", "r", stdin);
  if (writer) freopen("Test_output.txt", "w", stdout);
}
const long long SQRT = 65, lg = 18 + 2, inlim = 2147483647;
const long long maxn = 1e6 + 20, delta = 1e9 + 7, inf = 1e9 + 420;
int n;
vector<int> ans;
bool mark[maxn];
bool isPrime(int x) {
  for (int i = 2; i * i <= x; i++)
    if (x % i == 0) return 0;
  return 1;
}
void process(int x) {
  for (int i = 1; i * x <= n; i++) {
    if (i != 2 and !mark[x * i]) {
      ans.push_back(x * i);
      mark[x * i] = 1;
    }
  }
  if (ans.size() & 1) {
    ans.push_back(2 * x);
    mark[2 * x] = 1;
  }
}
int main() {
  opting();
  n = inp();
  for (int i = n / 2; i > 1; i--)
    if (isPrime(i)) process(i);
  cout << ans.size() / 2 << "\n";
  for (int i = 0; i < ans.size() / 2; i++)
    cout << ans[2 * i] << ' ' << ans[2 * i + 1] << "\n";
}
