#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define dbl long double
#define vec vector
#define um unordered_map
#define us unordered_set

using ull = unsigned long long;
using vi = vec<int>;
using vl = vector<ll>;
using vd = vector<double>;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
using pdd = pair<dbl, dbl>;

vi primes = {2};

void init() {
    int n = sqrt(1.01e9+1);
    vector<bool> locprimes(n, true);
    locprimes[0] = false;
    locprimes[1] = false;
    for (int i = 2; i <= n; i++ ) {
        if (locprimes[i] == false)
            continue;
        for (int j = 2 * i; j <= n; j += i) {
            locprimes[j] = false;
        }
    }
    for (int i = 3; i <= n; i++) {
        if (locprimes[i]) {
            primes.push_back(i);
        }
    }
}

bool is_prime(int n) {
    if (n == 1 || n == 0)
        return false;
    for (const auto p : primes) {
        if (p * p > n) {
            return true;
        }
        if (n % p == 0) {
            return false;
        }
    }
    return true;
}

int rec(string num) {
    int n = 0, power = 1;
    for (int i = int(num.size() - 1); i >= 0; i--) {
        n += (num[i] - '0') * power;
        power *= 10;
    }
    if (!is_prime(n))
        return 0;

    num.clear();
    int tmp = n;
    while (tmp > 0) {
        num.push_back((tmp % 10) + '0');
        tmp /= 10;
    }
    reverse(num.begin(), num.end());


    int maxx = 1;
    for (int i = 0; i < num.size(); i++) {
        string tmp;
        for (int j = 0; j < num.size(); j++) {
            if (j != i) {
                tmp.push_back(num[j]);
            }
        }
        if (tmp.size() != 0)
            maxx = max(maxx, rec(tmp) + 1);
    }
    return maxx;
}

int main(){
    init();
    
    int n, tmp;
    cin >> n;
    tmp = n;
    
    string num;
    while (tmp > 0) {
        num.push_back((tmp % 10) + '0');
        tmp /= 10;
    }
    reverse(num.begin(), num.end());

    cout << rec(num) << endl;
    
    return EXIT_SUCCESS;
}