#include <bits/stdc++.h>
using namespace std;
bool comp[30000];
int P[30000];
int seive(int n, int* P) {
  int p, q, K = 0;
  comp[1] = true;
  char even = 1;
  for (p = 2; p * p <= n; p += 2) {
    if (!comp[p]) {
      for (q = p * p; q <= n; q += p * (2 - even)) comp[q] = true;
    }
    if (p == 2) --p, even = 0;
  }
  for (int i = (1); i <= (n); ++i)
    if (!comp[i]) P[K++] = i;
  return K;
}
int muls[30000];
int has[30000];
int main() {
  int K;
  cin >> K;
  int lim = 2 * K * K;
  int least = (K + 1) / 2;
  vector<int> ans;
  ans.push_back(1);
  int max_added = 0;
  int L = seive(5 * K, P);
  for (int l = 0; l < L && ((int)ans.size()) < K; ++l) {
    for (int l2 = 0; l2 < (l); ++l2) {
      has[l2] = 0;
      for (int i = 0; i < (((int)ans.size())); ++i)
        if (!(ans[i] % P[l2])) ++has[l2];
    }
    int p = P[l];
    set<int> tmp;
    for (long long q = p; q <= lim; q *= p) {
      for (int i = 0; i < ((int)ans.size()) && (ans[i] % p); ++i) {
        long long new_num = 1ll * q * ans[i];
        if (new_num <= lim) {
          tmp.insert(new_num);
        }
      }
    }
    set<int>::iterator it = tmp.begin();
    for (int i = 0; it != tmp.end() && i < least; ++it) {
      int v = *it;
      assert(!(v % p));
      for (int j = 0; j < (l); ++j)
        if (!(v % P[j])) ++has[j];
      if (((int)ans.size()) < K) {
        ans.push_back(v);
      } else {
        bool found = false;
        for (int j = (K - 1); j >= (0); --j) {
          int w = ans[j];
          bool good = true;
          for (int h = (0); h <= (l); ++h) {
            int& pr = P[h];
            if (!(w % pr)) {
              if (has[h] <= least) {
                good = false;
                break;
              }
            }
          }
          if (good) {
            for (int h = (0); h <= (l - 1); ++h) {
              int& pr = P[h];
              if (!(w % pr)) {
                has[h]--;
              }
            }
            assert(ans[j] % p);
            ans[j] = v;
            found = true;
            break;
          }
        }
        assert(found);
        assert(ans.size() == K);
      }
      ++i;
    }
    assert(((int)ans.size()) <= K);
  }
  assert(((int)ans.size()) == K);
  sort(ans.begin(), ans.end());
  ans.erase(unique(ans.begin(), ans.end()), ans.end());
  assert(((int)ans.size()) == K);
  for (int l = 0; l < (L); ++l) {
    int cnt = 0;
    for (int i = 0; i < ((int)ans.size()); ++i)
      if (!(ans[i] % P[l])) {
        ++cnt;
      }
    assert(cnt == 0 || cnt >= least);
  }
  for (int i = 0; i < (((int)ans.size())); ++i) assert(ans[i] <= lim);
  for (int i = 0; i < (K); ++i) {
    if (i > 0) printf(" ");
    printf("%d", ans[i]);
  }
  printf("\n");
}
