#include<iostream>//isprimes加上会运行的更快,但是线上OLE。。。不清楚原因
#include<vector>
#include<string>
#include<set>
#include<cmath>
using namespace std;
bool isPrime(int num,vector<int>primes) {
for (int i = 0; i < primes.size() && primes[i] <= sqrt(num); i++) {
if (num%primes[i] == 0) {
return 0;
}
}
return 1;
}
int main() {
vector<int>primes;
set<int>result;
int n;
cin >> n;
if (n) {
primes.push_back(2);
}
int ranges = pow(10, n);
int temp = int(sqrt(ranges)) + 1;
//bool *isprimes = new bool[temp];
for (int i = 3; i*i<=ranges; i+=2) {
//if (isprimes[i]) {
bool fg = true;
for (int j = 0; j < primes.size() && primes[j] <= sqrt(i); j++) {
if (i%primes[j] == 0) {
fg = false;
break;
}
}
if (fg) {
primes.push_back(i);
//int step = i << 1;
//for (int j = i*i; j <= temp; j+=step) {
// isprimes[j] = false;
//}
}
//}
}
for (int i = n; i <=n; i++) {
if (i == 1) {
result.insert(2);
result.insert(3);
result.insert(5);
result.insert(7);
}
else {
if (i % 2 == 0) {
int pre = i / 2;
int ranges = pow(10, pre);
for (int hw =pow(10,pre-1); hw < ranges; hw++) {
string s = to_string(hw);
s += string(s.rbegin(), s.rend());
int temp = stoi(s);
if (isPrime(temp, primes)) {
result.insert(temp);
}
}
}
else {
int pre = i / 2;
int ranges = pow(10, pre);
for (int hw = pow(10, pre - 1); hw < ranges; hw++) {
for (int mid = 0; mid < 10; mid++) {
string s = to_string(hw);
string s0 = s;
s += to_string(mid);
s += string(s0.rbegin(), s0.rend());
int temp = stoi(s);
if (isPrime(temp, primes)) {
result.insert(temp);
}
}
}
}
}
}
cout << result.size() << endl;
while (!result.empty()) {
cout << *result.begin();
result.erase(result.begin());
if (!result.empty()) {
cout << ' ';
}
}
//delete[]isprimes;
}