#include <bits/stdc++.h>
using namespace std;
const int MAX_PRIMES = 15;
vector<int> primes;
vector<int> num[(1 << MAX_PRIMES) + 5];
bool used[(1 << MAX_PRIMES) + 5];
vector<int> BFS(int sz, int k) {
  queue<int> fila;
  vector<int> ans;
  fila.push((1 << sz) - 1);
  used[(1 << sz) - 1] = true;
  while (!fila.empty() && ans.size() < k) {
    int mask = fila.front();
    fila.pop();
    for (int i = 0; i < (int)num[mask].size() && ans.size() < k; i++) {
      ans.push_back(num[mask][i]);
    }
    for (int i = 0; i < sz; i++) {
      int nmask = mask & (~(1 << i));
      int bit = (mask >> i) & 1;
      if (bit && !used[nmask]) {
        used[nmask] = true;
        fila.push(nmask);
      }
    }
  }
  return ans;
}
int main(void) {
  int k;
  int maxi;
  vector<int> ans;
  scanf(" %d", &k);
  maxi = 2 * k * k;
  for (int i = 2;; i++) {
    bool good = true;
    for (int j = 0; j < (int)primes.size(); j++) {
      if (i % primes[j] == 0) {
        good = false;
        break;
      }
    }
    if (good) {
      int val = 1;
      while (1LL * val * i <= maxi) {
        num[1 << primes.size()].push_back(val * i);
        val *= i;
      }
      for (int mask = 1; mask < 1 << primes.size(); mask++) {
        int nmask = (1 << primes.size()) | mask;
        for (int j = 0; j < num[mask].size(); j++) {
          for (int p = 0; p < num[1 << primes.size()].size(); p++) {
            if (1LL * num[mask][j] * num[1 << primes.size()][p] > maxi) break;
            num[nmask].push_back(num[mask][j] * num[1 << primes.size()][p]);
          }
        }
      }
      primes.push_back(i);
      int counter = 0;
      for (int mask = 1; mask < 1 << primes.size(); mask++) {
        counter += num[mask].size();
      }
      if (counter >= k) {
        ans = BFS(primes.size(), k);
        break;
      }
    }
  }
  for (int i = 0; i < (int)ans.size(); i++) {
    if (i != 0) {
      printf(" ");
    }
    printf("%d", ans[i]);
  }
  printf("\n");
  return 0;
}
