#include <bits/stdc++.h>
using namespace std;
template <typename arg>
void debugger(const char* varname, arg&& var) {
  cout << varname << " = " << var << endl;
}
template <typename arg, typename... args>
void debugger(const char* varnames, arg&& var, args&&... vars) {
  const char* comma = strchr(varnames + 1, ',');
  cout.write(varnames, comma - varnames) << " = " << var << " | ";
  int sz = 1;
  if (isspace(comma[sz])) sz++;
  debugger(comma + sz, vars...);
}
using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
extern const int INF = INT_MAX - 5;
extern const int MOD = 1e9 + 7;
extern const int N = 2e5 + 200;
ll n;
bool is_prime(ll p) {
  if (p == 0) return true;
  if (p == 2) return true;
  if (p == 1) return false;
  if (p % 2 == 0) return false;
  for (ll i = 3; i * i <= p; i += 2) {
    if (p % i == 0) return false;
  }
  return true;
}
int main() {
  scanf("%lld", &n);
  vi ans;
  ll tot = n;
  while (tot) {
    if (is_prime(n)) {
      ll diff = tot - n;
      if (diff == 1) {
        n--;
        continue;
      }
      if ((int)ans.size() == 1) {
        if (!is_prime(diff)) {
          n--;
          continue;
        }
      }
      ans.emplace_back(n);
      tot = n = diff;
    } else {
      n--;
    }
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < (int)ans.size(); ++i) {
    if (i != 0) printf(" ");
    printf("%d", ans[i]);
  }
  puts("");
  return 0;
}
