#include <bits/stdc++.h>
long long prime(long long n);
long long k, a[100001], b[100001];
void sieve() {
  long long i, j, t = 1, s = sqrt(100001);
  b[0] = 1;
  a[1] = 2;
  for (i = 4; i <= 100001; i += 2) b[i] = 1;
  for (i = 3; i <= s; i += 2) {
    if (!b[i]) {
      a[++t] = i;
      for (j = i * i; j <= 100001; j += i) b[j] = 1;
    }
  }
}
struct df {
  int a, b;
} f[10];
bool cmp(df a, df b) { return a.a > b.a; }
long long prime(long long n) {
  long long s = sqrt(n);
  for (long long i = 2; i <= s; i++) {
    if (n % i == 0) return 0;
  }
  return 1;
}
long long big(long long a, long long b, long long p) {
  if (b == 0)
    return 1;
  else if (b % 2) {
    return ((a % p) * big(a, b - 1, p)) % p;
  } else {
    long long c = big(a, b / 2, p);
    return ((c % p) * (c % p)) % p;
  }
}
int ii;
using namespace std;
int main() {
  long long n, i = 0, j, m = 0, d, su = 0, r, y, x = 0, q = 0, o, t;
  scanf("%lld", &n);
  sieve();
  if (prime(n)) {
    printf("1\n%lld", n);
  } else if (prime(n - 2)) {
    printf("2\n2 %lld", n - 2);
  } else {
    j = 1;
    for (i = 1;; i++) {
      t = a[i] + a[j];
      if (prime(n - t)) {
        cout << "3\n" << a[i] << " " << a[j] << " " << n - t;
        return 0;
      } else {
        if (i == j)
          j++;
        else
          i++;
      }
    }
  }
}
