#include <bits/stdc++.h>
using namespace std;
const int maxn = 1934567;
map<int, int> Mp;
vector<long long> primes;
int Sieve(int n = maxn) {
  bool vprimes[n + 1];
  memset(vprimes, true, sizeof(vprimes));
  for (int i = 2; i * i <= n; i++) {
    if (vprimes[i]) {
      for (int j = i; j * i <= n; j++) {
        vprimes[j * i] = false;
      }
    }
  }
  for (int i = 2; i <= n; i++) {
    if (vprimes[i]) {
      primes.push_back(i);
    }
  }
  return 0;
}
int main() {
  std::ios::sync_with_stdio(false);
  Sieve();
  reverse(primes.begin(), primes.end());
  int n, k;
  cin >> n >> k;
  if (n < 2) {
    if (k == 0) {
      cout << "1" << endl;
    } else {
      cout << "-1" << endl;
    }
    return 0;
  }
  int p = n / 2;
  int ones = p - 1;
  int mx = k - ones;
  if (mx <= 0) {
    cout << "-1\n";
    return 0;
  }
  cout << mx << " " << 2 * mx << " ";
  int cnt = 2;
  int pid = 0;
  int garbage = 12345;
  Mp[mx] = 1;
  Mp[2 * mx] = 1;
  for (int i = 0; i < p - 1; i++) {
    int cand = primes[pid];
    while (Mp.count(cand) != 0) {
      cand = primes[pid];
      pid++;
    }
    Mp[cand] = 1;
    while (Mp.count(garbage) != 0) {
      garbage++;
    }
    Mp[garbage] = 1;
    cout << cand << " " << garbage << " ";
    cnt += 2;
  }
  if (cnt < n) {
    while (Mp.count(garbage) != 0) {
      garbage++;
    }
    cout << garbage;
  }
  cout << endl;
}
