#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

//这题练筛法

void Func68(void){
	//整理一下筛法的逻辑:
	//1.被筛掉的必是合数
	//2.任何一个合数可被分解质因数 这意味着 如果所有小于自己的质数都没把自己筛掉 自己就是质数 
	//3.结合1,被筛剩下的数中一定包含当前范围所有质数 
	//所以扫到当前数时,必已在其之前所有质数攻击下存活,其必是质数。 
	int n;
	while(scanf("%d",&n) != EOF){
		if (n<2 || n>10000){
			printf("Error!\n");
			exit(0);
		}
		vector<int> prime;
		bool Isprime[n];
		fill(Isprime,Isprime+n,true);
		for(int i=2; i<n; i++){
			if(!Isprime[i]){
				continue;
			}
			prime.push_back(i);//这里push进去就不用再扫一遍n这么大的数组 
			for(int j=i*i; j<n; j+=i){
				Isprime[j] = false;
			}
		}
		int begin = 0;
		for(int i=0; i<prime.size(); i++){//就看到了用vector的必要性 
			if(prime[i]%10 == 1){
				if(!begin){
					begin = 1;
					printf("%d",prime[i]);
				}else{
					printf(" %d",prime[i]);
				}
			}
		}
	}
}

int main(){
	Func68();
	return 0;
}