#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long MD = 1e9 + 7;
const double pi = acos(-1);
struct segmentTree {
  long long tl = 1, tr = (1ll << 30);
  segmentTree* left = nullptr;
  segmentTree* right = nullptr;
  long long val = 0;
  long long push = 0;
  segmentTree(long long tl, long long tr) : tl(tl), tr(tr) {}
  segmentTree() = default;
  void createSons(long long type) {
    long long tm = (tl + tr) / 2;
    if (!left && type != 1) {
      left = new segmentTree(tl, tm);
    }
    if (!right && type != 0) {
      right = new segmentTree(tm + 1, tr);
    }
  }
  void doPush() {
    if (push != 0) {
      createSons(2);
      if (tl != tr) {
        left->push += push;
        right->push += push;
      }
      val += push * (tr - tl + 1);
      push = 0;
    }
  }
  void update(long long l, long long r, long long val) {
    doPush();
    if (l > r) {
      return;
    }
    if (tl == l && tr == r) {
      push = val;
      doPush();
      return;
    }
    long long tm = (tl + tr) / 2;
    long long res = 0;
    if (l <= tm || left) {
      createSons(0);
      left->update(l, min(tm, r), val);
      res += left->val;
    }
    if (r > tm || right) {
      createSons(1);
      right->update(max(tm + 1, l), r, val);
      res += right->val;
    }
    this->val = res;
  }
  long long get(long long l, long long r) {
    doPush();
    if (l > r) {
      return 0;
    }
    if (l == tl && tr == r) {
      return val;
    }
    long long tm = (tl + tr) / 2;
    long long res = 0;
    if (l <= tm || left) {
      createSons(0);
      res += left->get(l, min(tm, r));
    }
    if (r > tm || right) {
      createSons(1);
      res += right->get(max(tm + 1, l), r);
    }
    return res;
  }
};
ostream& operator<<(ostream& stream, const vector<long long>& v) {
  for (auto i : v) {
    stream << i << " ";
  }
  return stream;
}
pair<long long, long long> operator+=(pair<long long, long long>& a,
                                      const pair<long long, long long>& b) {
  a.first += b.first;
  a.second += b.second;
  return a;
};
long long gcd(long long a, long long b, long long& x, long long& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long d = gcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
bool find_any_solution(long long a, long long b, long long c, long long& x0,
                       long long& y0, long long& g) {
  g = gcd(abs(a), abs(b), x0, y0);
  if (c % g != 0) return false;
  x0 *= c / g;
  y0 *= c / g;
  if (a < 0) x0 *= -1;
  if (b < 0) y0 *= -1;
  return true;
}
void print(long long x, long long y, long long n) {
  if (x >= 0 && y >= 0 && x + y <= n) {
    cout << x << " " << y << " " << n - (x + y) << "\n";
  } else {
    cout << -1 << "\n";
  }
}
struct str {
  long long l, r;
  char ch;
};
long long n, k;
bool used1[1000006], used2[1000006];
long long cnt[1000006];
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  long long sum = 0;
  for (long long i = 1; i <= n; i++) {
    sum += i;
    cnt[i] = 1;
  }
  if (k < sum) {
    cout << -1 << "\n";
    return 0;
  }
  long long mn = 1;
  vector<long long> my;
  for (long long i = n; i >= 1; i--) {
    while (cnt[i]) {
      if (i <= mn) {
        break;
      }
      if (sum + i - mn <= k) {
        sum += i;
        sum -= mn;
        cnt[i]--;
        cnt[mn]++;
        while (cnt[mn] == 2) {
          mn++;
        }
      } else {
        break;
      }
    }
  }
  for (long long i = 1; i <= n; i++) {
    while (cnt[i] != 2) {
      my.push_back(i);
      cnt[i]++;
    }
  }
  long long ans = 0;
  for (auto i : my) {
    ans += i;
  }
  vector<long long> r1(n, 0), r2(n, 0);
  long long cur = 0;
  sort(my.begin(), my.end());
  for (auto i : my) {
    if (cur % 2) {
      r2[cur] = i;
      used2[i] = true;
    } else {
      r1[cur] = i;
      used1[i] = true;
    }
    cur++;
  }
  long long uk1 = 1, uk2 = 1;
  for (long long i = 0; i < n; i++) {
    if (!r1[i]) {
      while (used1[uk1]) {
        uk1++;
      }
      r1[i] = uk1;
      used1[uk1] = true;
    }
    if (!r2[i]) {
      while (used2[uk2]) {
        uk2++;
      }
      r2[i] = uk2;
      used2[uk2] = true;
    }
  }
  cout << ans << "\n";
  cout << r1 << "\n";
  cout << r2 << "\n";
}
