//主要难点:利用筛法找素数(initial)
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1e5 + 10;
bool isprime[maxn];
vector<int>prime;
void initial() {
for (int i = 0; i < maxn; i++) { //初始化
isprime[i] = true; //假设全部是质数
}
isprime[0] = false; //已知0,1不是质数
isprime[1] = false;
for (int i = 2; i < maxn; i++) {
if (!isprime[i]) { //不是质素跳过
continue;
}
prime.push_back(i); //是质数加入数组
for (int j = i * i; j < maxn;
j += i) { //。当判定i为素数,要标记其倍数为非素数时,并未从2*i开始标记,而是直接从i*i开始标记的
isprime[j] =
false; //原因很明显:i*k(k<i)必定已经在求得k的某个素因数(必定小于i)时被标记过,即i*k同时也是k的素因数的倍数
}
}
}
// int numberofprimefactor(int number) { //求质因子个数
// int answer = 0; //记录答案质因子个数
// for (int i = 0; i < prime.size(); i++) {
// int factor = prime[i];
// if (number < factor) {
// break; //循环退出条件
// }
// int exponent = 0;
// while (number % factor == 0) {
// exponent++; //当前质因子对应指数
// number /= factor;
// }
// answer += exponent; //答案为各质因子指数和
// }
//if (number > 1) {
// answer += 1;
// }
// return answer;
// }
int main() {
initial();//shai fa
int n;
while (scanf("%d", &n) != EOF) {
bool isprint = false;
for (int i = 0; i < prime.size()&&prime[i]<n; i++) {
if ( prime[i] % 10 == 1) {
isprint = true;
printf("%d ", prime[i]);
}
}
if (!isprint) {
printf("-1");
}
printf("\n");
}
return 0;
}
// int k; //第个质数
// while (scanf("%d", &k) != EOF) {
// printf("%d\n", prime[k - 1]);
// }
// int number; //求质因子个数
// while (scanf("%d", &number) != EOF) {
// printf("%d\n", numberofprimefactor(number));
// }