#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using vl = vector<ll>;
template<class T> using vc = vector<T>;
template<class T> using vvc = vector<vector<T>>;

#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define repr(i, n) for (ll i = (n)-1; i >= 0; i--)
#define repe(i, l, r) for (ll i = (l); i < (r); i++)
#define reper(i, l, r) for (ll i = (r)-1; i >= (l); i--)
#define repa(i,n) for (auto& i: n)

template<class T1, class T2> inline bool chmax(T1 &a, const T2 &b) {if (a<b) { a=b; return 1;} return 0;}
template<class T1, class T2> inline bool chmin(T1 &a, const T2 &b) {if (b<a) { a=b; return 1;} return 0;}
struct init{init(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);cerr<<fixed<<setprecision(15);}}init_;

#ifdef DEBUG
template <class T> void verr(const set<T> &st) { repa(a, st) cerr << a << " "; cerr << endl; }
template <class S, class T> void verr(const map<S, T> &mp) { repa(a, mp) cerr << "{" << a.first << ", " << a.second << "} "; cerr << endl; }
template <class S, class T, class N> void verr(const vector<pair<S,T>>& a, const N& n) { rep(i, n) cerr << "{" << a[i].first << ", " << a[i].second << "} "; cerr << endl; }
template <class T, class N> void verr(const vector<T>& a, const N& n) { rep(i, n) cerr << a[i] << " "; cerr << endl; }
ll dbgt = 1; void err() { cerr << "passed " << dbgt++ << endl; }
template<class H, class... T> void err(H&& h,T&&... t){ cerr<< h << (sizeof...(t)?" ":"\n") << flush; if(sizeof...(t)>0) err(forward<T>(t)...); }
#endif

const ll INF = 4e18;
const ld EPS = 1e-11;
const ld PI = acos(-1.0L);
const ll MOD = 1e9 + 7;
// const ll MOD = 998244353;
//--------------------------------------------------------------------------------//

int main() {
    ll N;
    cin >> N;

    if(N == 3){
        cout << "6 10 15" << endl;
        return 0;
    }

    vl cand;
    repe(i, 1, 10001){
        int d2 = i % 2 == 0, d3 = i % 3 == 0, d5 = i % 5 == 0;
        if (d2 + d3 + d5 >= 2) cand.eb(i);
    }

    // vl ans(N);
    rep(i, N) cout << cand[i] << " ";
    cout << endl;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> point;
#define endl '\n'
#define F first
#define S second
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define dbg2(x,y) cerr<<#x<<" = "<<x<<", "<<#y<<" = "<<y<<endl
#define dbg3(x,y,z) cerr<<#x<<" = "<<x<<", "<<#y<<" = "<<y<<", "<<#z<<" = "<<z<<endl
#define dbg4(x,y,z,q) cerr<<#x<<" = "<<x<<", "<<#y<<" = "<<y<<", "<<#z<<" = "<<z<<", "<<#q<<" = "<<q<<endl
#define FOR(sz) for(int i = 0; i < sz; ++i)
#define dbg_array(x,sz) FOR(sz) cerr << x[i] << " \n"[i==sz-1]
#define X real()
#define Y imag()

const int d4i[4] = { -1, 0, 1, 0 }, d4j[4] = { 0, 1, 0, -1 };
const int d8i[8] = { -1, -1, 0, 1, 1, 1, 0, -1 }, d8j[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };

void _init_() {
	ios_base::sync_with_stdio(0), cin.tie(0);
#ifdef ECLIPSE
	freopen("input.txt", "rt", stdin);
//	freopen("output.txt", "wt", stdout);
#endif
}

const int N = 2e4 + 9, M = 1e8 + 9, SEG = 131072; // SEG = 1 << ((int) ceil(log2(N)) + 1)
const int Mod_M = 1e9 + 7;

int n;
vector<int> ans;
int vis[N], vid = 1;
void generate(int num, int a, int b) {
	if (int(ans.size()) == n) return;
	if (num > 10000) return;
	if (vis[num] != vid) ans.push_back(num);
	vis[num] = vid;
	generate(num * a, a, b);
	generate(num * b, a, b);
}

vector<int> sieve(int n) {
	vector<bool> is_prime(n + 1, true);
	vector<int> prime;
	for (int i = 2; i <= n; ++i) {
		if (!is_prime[i]) continue;
		else {
			prime.push_back(i);
			for (int j = 2; i * j <= n; ++j) {
				is_prime[i * j] = 0;
			}
		}
	}
	return prime;
}

ll GCD(ll a, ll b) { // a>b
	if (b == 0) return a;
	return GCD(b, a % b);
}

bool checker() {
	for (int i = 0; i < int(ans.size()); ++i) {
		for (int j = i + 1; j < int(ans.size()); ++j) {
			ll gcd;
			if (ans[i] > ans[j]) gcd = GCD(ans[i], ans[j]);
			else if (ans[i] < ans[j]) gcd = GCD(ans[j], ans[i]);
			else {
				dbg2(ans[i], ans[j]);
				return false;
			}

			if (gcd == 1) {
				return false;
			}
		}
	}
	ll gcd = ans[0];
	for (int i = 1; i < int(ans.size()); ++i) {
		gcd = GCD(gcd, ans[i]);
	}

	return gcd == 1;
}
void solve() {
//	vector<int> prime = sieve(1000);
	scanf("%d", &n);
	ans.push_back(6);
	ans.push_back(10);
	ans.push_back(15);
//	vis[6] = vid;
//	vis[10] = vid;
//	vis[15] = vid;
//	generate(6, 2, 3);
//	generate(10, 2, 5);
//	generate(15, 5, 3);

//	int num = 2 * 3, k = 3, num2 = num;
//	while (num2 < 10000) {
//		for (int i = k; i < int(prime.size()); ++i) {
//			int tmp = num2 * prime[i];
//			if (tmp > 10000 || int(ans.size()) == n) break;
//			generate(tmp, 2, 3);
//			generate(tmp, 2, prime[i]);
//			generate(tmp, 3, prime[i]);
//			generate(tmp, 2, prime[k - 1]);
//			generate(tmp, 3, prime[k - 1]);
//		}
//		num2 = num * prime[k];
//		++k;
//	}
	for (int i = 16; i < 10001; ++i) {
		if (GCD(i, 6) > 1 && GCD(i, 10) > 1 && GCD(i, 15) > 1) ans.push_back(i);
	}
	dbg(ans.size());
	dbg(checker());
	for (int i = 0; i < n; ++i)
		printf("%d%c", ans[i], " \n"[i == int(ans.size()) - 1]);
}

int main() {
	_init_();
//	int t;
//	scanf("%d", &t);
//	while (t--) {
	solve();
//	}
	return 0;
}

