#include <bits/stdc++.h>
using namespace std;
long int n, k;
bool prime[10000001];
vector<long int> v;
void sieve(long int n) {
  prime[0] = false;
  prime[1] = false;
  long int m = (long int)sqrt(n);
  for (long int i = 2; i <= m; i++)
    if (prime[i])
      for (long int k = i * i; k <= n; k += i) prime[k] = false;
}
int main() {
  long int i, j, a, b, c;
  scanf("%ld %ld", &n, &k);
  memset(prime, true, sizeof(prime));
  a = 1000 * 1000;
  sieve(a);
  for (i = 1; i <= a; i++) {
    if (prime[i] == true) {
      v.push_back(i);
    }
  }
  if (k == 0 && n == 1) {
    printf("1");
  } else if (n < 2) {
    printf("-1");
  } else {
    if (n % 2 == 1) {
      a = (n - 1) / 2;
    } else {
      a = n / 2;
    }
    if (a > k) {
      printf("-1");
    } else if (a == k) {
      i = 1;
      vector<long int>::iterator it;
      for (it = v.begin(); it != v.end() && (i <= a); ++it) {
        if (*it == 2) {
          continue;
        } else {
          printf("%ld %ld ", *it, *it + 1);
          i++;
        }
      }
      if (n % 2 == 1) {
        printf("%ld", *it);
      }
    } else {
      b = k - (a - 1);
      printf("%ld %ld ", b, 2 * b);
      i = 1;
      vector<long int>::iterator it;
      for (it = v.begin(); it != v.end() && (i < a); ++it) {
        if (*it == 2) {
          continue;
        }
        if ((*it == b) || ((*it + 1) == b) || ((*it + 1) == (2 * b))) {
          continue;
        } else {
          printf("%ld %ld ", *it, *it + 1);
          i++;
        }
      }
      if (n % 2 == 1) {
        while ((*it == b) || ((*it + 1) == b) || ((*it + 1) == (2 * b))) {
          ++it;
        }
        printf("%ld", *it);
      }
    }
  }
  return 0;
}
