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)