#include <bits/stdc++.h>
using namespace std;
const long long MAX = 2500000000;
const long long inf = 12345678900000;
const long double EPS = 1e-9;
const long double PI = 2 * asin(1.0);
const long long mod = 1e9 + 7;
inline int long double_cmp(long double x, long double y = 0,
                           long double tol = EPS) {
  return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
}
vector<int> primos;
int prim[32622];
void sieve() {
  primos.push_back(3);
  for (int i = 2; i < 32622; i += 2) prim[i] = 1;
  for (int i = 3; i < 32622; i += 3) prim[i] = 1;
  for (long long i = 5; i < 32622; i += 2) {
    if (prim[i] == 0) {
      primos.push_back(i);
      for (long long j = i * i; j < 32622; j += i) {
        prim[j] = 1;
      }
    }
  }
}
bool is(int n) {
  if (n < 3) return (n == 2);
  if ((n & 1) == 0) return false;
  int lim = sqrt(n);
  for (int i = 3; i <= lim; i += 2)
    if (n % i == 0) return false;
  return true;
}
int main() {
  sieve();
  int n;
  scanf("%d", &n);
  if (is(n)) {
    printf("1\n");
    printf("%d\n", n);
  } else {
    for (int i = 0; i < ((int)primos.size()); ++i) {
      for (int j = i; j < ((int)primos.size()); ++j) {
        if (primos[i] + primos[j] == n) {
          printf("2\n");
          printf("%d ", primos[i]);
          printf("%d\n", primos[j]);
          return 0;
        }
        if (primos[i] + primos[j] > n) break;
        int aux = n - primos[i] - primos[j];
        if (is(aux)) {
          printf("3\n");
          printf("%d ", primos[i]);
          printf("%d ", primos[j]);
          printf("%d\n", aux);
          return 0;
        }
      }
    }
  }
}
