#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
const int inf32 = 1e9 + 9;
const long long inf64 = 1e18 + 18;
const int N = 6e5 + 5;
const long long mod = 1e9 + 7;
map<int, int> mp;
vector<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
int n, mx;
void go(int &f, int a, int b, int mn) {
  if (a * b > mx) {
    if (a % b) return;
    mp[a] += mn;
    f -= mn;
    return;
  }
  go(f, a * b, b, (mn + 1) / 2);
  if (a % b) return;
  int t = min(f, mn);
  mp[a] += t;
  f -= t;
}
bool show() {
  int rez = 0;
  for (auto &x : mp) rez += x.second;
  return rez == n;
}
bool check(int j) {
  mp.clear();
  mp[1] = n;
  int half = (n + 1) / 2;
  half += n / 100;
  for (int i = 0; i < j; ++i) {
    int x = primes[i];
    int cnt = 0;
    bool flag = true;
    while (flag) {
      flag = false;
      for (auto &y : mp) {
        if (!y.second || !(y.first % x)) continue;
        int t = cnt;
        cnt += y.second;
        go(y.second, y.first, x, (y.second + 1) / 2);
        cnt -= y.second;
        flag |= t != cnt;
        if (cnt >= half) break;
      }
      if (cnt >= (n + 1) / 2) break;
    }
    if (!flag) {
      for (auto &y : mp) {
        if (y.second > 1 && y.first * x < mx) {
          mp[y.first * x] += 1;
          --y.second;
          ++cnt;
        }
        if (cnt >= (n + 1) / 2) break;
      }
      if (cnt < (n + 1) / 2) return false;
    }
  }
  for (auto &y : mp) {
    if (y.second > 1) {
      for (int i = 0; i < j; ++i) {
        int x = primes[i];
        for (int i = x; y.second && i * y.first < mx; i *= x) {
          if (!mp[y.first * i]) {
            mp[y.first * i] = 1;
            --y.second;
          }
        }
      }
    }
  }
  if (n > 1000) {
    queue<int> lil;
    for (int i = 0; i < j; ++i) {
      for (int k = i + 1; k < j; ++k) {
        int x = primes[i], y = primes[k];
        if (!mp[x * y]) lil.push(x * y);
        if (!mp[x]) lil.push(x);
        if (!mp[y]) lil.push(y);
        if (!mp[y * y]) lil.push(y * y);
        if (!mp[x * x]) lil.push(x * x);
        if (!mp[x * x * y]) lil.push(x * x * y);
        if (!mp[x * y * y]) lil.push(x * y * y);
        if (!mp[x * x * y * y]) lil.push(x * x * y * y);
      }
    }
    for (auto &x : mp) {
      while (x.second > 1) {
        while (!lil.empty() && mp[lil.front()]) lil.pop();
        if (lil.empty()) return false;
        --x.second;
        mp[lil.front()] = 1;
        lil.pop();
      }
    }
  }
  for (auto &x : mp) {
    if (x.second > 1) return false;
  }
  return true;
}
void solve() {
  cin >> n;
  mx = 2 * n * n;
  for (int j = 1; !check(j); ++j)
    ;
  int cnt = 0;
  for (auto &x : mp) {
    if (x.second) cout << x.first << " ";
  }
}
int main() {
  solve();
  return 0;
}
