//主要难点:利用筛法找素数(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));
// }