/* http://projecteuler.net/
 *
 * Problem 37
 * Find the sum of the only eleven primes that are both truncatable
 * from left to right and right to left.
 *
 * Solution by Melkor (Filip Niksic, fniksic@gmail.com)
 *
 **/

#include <iostream>
#include <queue>
#include <bitset>
#include <set>

using namespace std;

const int max_number = 1000000;

bitset<max_number> sieve;
set<int> ltrunc, rtrunc;

void generate_primes() {
    sieve.set();
    sieve.reset(0);
    sieve.reset(1);

    for (int i = 2; i*i < max_number; ++i)
	if (sieve[i])
	    for (int j = i+i; j < max_number; j += i)
		sieve.reset(j);
}

void generate_ltrunc() {
    queue<int> q;

    q.push(3);
    q.push(7);

    while (!q.empty()) {
	int t = q.front();
	q.pop();
	if (t > 10)
	    ltrunc.insert(t);

	int pow = 1;
	while (pow <= t)
	    pow *= 10;
	
	for (int digit = 1; digit < 10; ++digit) {
	    int newnum = digit * pow + t;
	    if (newnum < max_number && sieve[newnum])
		q.push(newnum);
	}
    }
}

void generate_rtrunc() {
    queue<int> q;
    static const int digits[] = {1, 3, 7, 9};

    q.push(2);
    q.push(3);
    q.push(5);
    q.push(7);

    while (!q.empty()) {
	int t = q.front();
	q.pop();
	if (t > 10)
	    rtrunc.insert(t);
	
	for (int i = 0; i < 4; ++i) {
	    int newnum = t * 10 + digits[i];
	    if (newnum < max_number && sieve[newnum])
		q.push(newnum);
	}
    }
}

int main() {
    generate_primes();
    generate_ltrunc();
    generate_rtrunc();

    int suma = 0;
    for (set<int>::iterator it = ltrunc.begin(); it != ltrunc.end(); ++it)
	if (rtrunc.count(*it))
	    suma += *it;
    
    cout << suma << endl;
    
    return 0;
}

