#include <bits/stdc++.h>
template <typename T>
inline void checkMin(T &a, T b) {
  if (b < a) a = b;
}
template <typename T>
inline void checkMax(T &a, T b) {
  if (a < b) a = b;
}
using namespace std;
const int MAX_K = 5005;
const int MAX_KK = MAX_K * MAX_K * 2;
vector<int> prime;
void gen_prime(vector<int> &p, int MAX_N) {
  vector<bool> np(MAX_N, false);
  for (int i = 2; i < MAX_N; ++i) {
    if (!np[i]) p.push_back(i);
    for (int j : p) {
      if (j * i >= MAX_N) break;
      np[j * i] = true;
      if (i % j == 0) break;
    }
  }
}
int k, kk, pn, i, buf[MAX_K];
void dfs(int val, int o) {
  if (o == pn) {
    buf[i++] = val;
    return;
  }
  for (; val <= kk && i < k; val *= prime[o]) {
    dfs(val, o + 1);
  }
}
bool check(int pn) {
  if (i != k) return false;
  vector<int> acc(pn, 0);
  for (int j = 0; j < int(k); ++j) {
    for (int o = 0; o < int(pn); ++o) {
      if (buf[j] % prime[o] == 0) {
        ++acc[o];
      }
    }
  }
  for (int o = 0; o < int(pn); ++o) {
    if (2 * acc[o] < k) {
      return false;
    }
  }
  return true;
}
int main() {
  gen_prime(prime, MAX_K);
  scanf("%d", &k);
  kk = 2 * k * k;
  for (pn = 1;; ++pn) {
    i = 0;
    dfs(1, 0);
    if (check(pn)) {
      break;
    }
  }
  for (int i = 0; i < int(k); ++i) {
    printf("%d%s", buf[i], i + 1 == k ? "\n" : " ");
  }
  return 0;
}
