def lowbit(x):
"""
计算并返回整数x的二进制表示中「最低位的1」对应的值
原理:利用补码特性,-x是x按位取反加1,x & -x会仅保留最低位的1,其余位清零
示例:x=6(110) → lowbit=2;x=5(101) → lowbit=1
"""
return x & (-x)
# ===================== 主逻辑开始 =====================
# 1. 输入处理:读取两个整数n(序列长度)和m(目标值)
n, m = map(int, input().split())
# 2. 初始化变量
m2 = [] # 存储m二进制分解后,值大于1的lowbit分量(l>1的部分)
cnt = 0 # 统计m2中元素的个数(即l>1的分量数量)
# 3. 核心逻辑:仅处理m为奇数的情况(偶数直接无解)
if m & 1: # m & 1 等价于判断m%2==1(奇数)
temp_m = m # 临时变量保存m,避免修改原始输入值
valid = True # 标记分解结果是否合法(所有lowbit分量≤n)
# 4. 对m进行二进制分解(拆分为若干2^k之和)
while temp_m > 0:
l = lowbit(temp_m) # 提取当前temp_m最低位的1对应的值
if l > n: # 若该分量超过序列长度n,无法构造,标记为不合法
valid = False
break
if l > 1: # 仅存储值大于1的分量(l=1单独处理)
m2.append(l)
cnt += 1 # 计数+1
temp_m -= l # 移除已处理的最低位,继续分解剩余部分
# 5. 合法性校验:若分解出的分量超过n,输出-1
if not valid:
print(-1)
else:
# 6. 输出第一部分:1到n的连续序列(基准序列)
# 构造序列字符串列表,用空格拼接后打印
first_part = [str(i) for i in range(1, n+1)]
print(' '.join(first_part))
# 7. 输出操作总数:cnt*2 +1(cnt<<1等价于cnt*2,|1等价于+1)
# 含义:l=1对应1次操作,每个l>1的分量对应2次操作,总计2*cnt+1次
print((cnt << 1) | 1)
# 8. 构造操作序列:按题目规则拼接输出内容
output = ["1 "] # 先处理l=1的操作,输出"1 "(末尾保留空格)
# 遍历每个l>1的分量,构造对应3段输出
for num in m2:
# 第一段:输出num-1并换行(对应操作1)
output.append(f"{num - 1}\n")
# 第二段:输出"num num"并换行(单点操作,对应操作2)
output.append(f"{num} {num}\n")
# 第三段:输出num+1并保留空格(后续拼接,对应操作3)
output.append(f"{num + 1} ")
# 9. 补充末尾的n并换行,完成操作序列闭合
output.append(f"{n}\n")
# 10. 合并所有输出片段并打印(减少IO次数,提升效率)
# end='' 避免print自动添加额外换行
print(''.join(output), end='')
else:
# 4. m为偶数时,题目要求直接输出-1(无解)
print(-1)