#include <bits/stdc++.h>
using namespace std;
long long tr = 1;
long long s = 1;
long long base = 1e9 + 7;
int check(string s1, string s2, int n) {
  for (int i = 0; i < s1.length(); ++i) {
    if (s1[i] != s2[i]) {
      --n;
    }
  }
  return n;
}
void tri(int n) {
  while (n > 0) {
    tr *= 3;
    tr %= base;
    --n;
  }
  return;
}
void sem(int n) {
  while (n > 0) {
    s *= 7;
    s %= base;
    --n;
  }
  return;
}
char noteq(char a, char b) {
  char res;
  for (char res = 'a'; res <= 'c'; ++res) {
    if (res != a && res != b) {
      return res;
    }
  }
}
inline vector<char> getprime(int n) {
  vector<char> v(n + 1, true);
  v[1] = false;
  for (int i = 2; i * i <= n; i++)
    if (v[i])
      for (int j = i * i; j <= n; j += i) v[j] = false;
  return v;
}
bool isprime(int n, vector<int> &v) {
  for (int i = 0; v[i] * v[i] <= n; i++)
    if (n % v[i] == 0) return false;
  return true;
}
int main() {
  string s1, s2;
  string s3;
  int n, t;
  vector<int> eq;
  vector<int> neq;
  char another;
  cin >> n;
  auto is_prime = getprime(1e6);
  vector<int> primes;
  primes.reserve(1e4);
  for (int i = 2; i < is_prime.size(); i++)
    if (is_prime[i]) primes.push_back(i);
  if (isprime(n, primes)) {
    cout << 1 << endl << n;
    return 0;
  }
  if (isprime(n - 2, primes)) {
    cout << 2 << endl << n - 2 << " " << 2;
    return 0;
  }
  for (int i = 0; i < primes.size(); ++i) {
    for (int j = 0; j < primes.size(); ++j) {
      int sum = primes[i] + primes[j];
      if (sum < (n - 1) && isprime(n - sum, primes)) {
        cout << 3 << endl << primes[i] << " " << primes[j] << " " << n - sum;
        return 0;
      }
    }
  }
  cout << 3 << endl << "2 2 " << n - 4;
}
