在本题中,我们将考虑集合 $\{1, \dots, n\}$ 的 $n + m$ 个子集构成的序列。集合 $A_1, \dots, A_n$ 定义如下:值 $1 \le i \le n$ 属于集合 $A_j$ 当且仅当 $i$ 能被 $j$ 整除。
例如,对于 $n = 7$,各集合如下: $A_1 = \{1, 2, 3, 4, 5, 6, 7\}$ $A_2 = \{2, 4, 6\}$ $A_3 = \{3, 6\}$ $A_4 = \{4\}$ $A_5 = \{5\}$ $A_6 = \{6\}$ * $A_7 = \{7\}$
后续的 $m$ 个集合 $A_{n+1}, A_{n+2}, \dots, A_{n+m}$ 由对之前集合进行的并集、交集或补集运算产生。 集合 $A_i$ 与 $A_j$ 的并集运算(记作 $A_i \cup A_j$)生成包含所有属于 $A_i$ 或 $A_j$ 的数字的集合。 集合 $A_i$ 与 $A_j$ 的交集运算(记作 $A_i \cap A_j$)生成包含所有同时属于 $A_i$ 和 $A_j$ 的数字的集合。 * 集合 $A_i$ 的补集运算(记作 $A_i'$)生成包含所有 $1 \le j \le n$ 且不属于 $A_i$ 的整数的集合。
给定整数 $n$ 和目标集合 $B$,你的任务是选择一个整数 $m$ ($0 \le m \le 100\,000$) 以及一个包含 $m$ 次操作的序列,使得集合 $A_{n+m}$ 等于集合 $B$。可以证明,在题目给定的限制条件下,总是可以构造出 $\{1, \dots, n\}$ 的任意子集,且操作次数在限制范围内。
输入格式
输入的第一行包含两个整数 $n, s$ ($1 \le n \le 50\,000, 1 \le s \le n$),分别表示初始集合的数量和目标集合 $B$ 的大小。第二行包含 $s$ 个整数 $b_1, b_2, \dots, b_s$ ($1 \le b_1 < b_2 < \dots < b_s \le n$),表示集合 $B$ 中的元素。
输出格式
第一行输出一个整数 $m$ ($0 \le m \le 100\,000$)。接下来的 $m$ 行应描述后续的操作。第 $i$ 行描述集合 $A_{n+i}$ 的生成方式,格式为以下三种之一:
1 x y —— 表示并集运算 $A_{n+i} = A_x \cup A_y$
2 x y —— 表示交集运算 $A_{n+i} = A_x \cap A_y$
* 3 x —— 表示补集运算 $A_{n+i} = A_x'$
此外,必须满足 $A_{n+m} = B$。
样例
输入 1
7 4 1 2 4 6
输出 1
8 1 5 7 2 2 3 3 8 2 10 8 3 3 1 12 12 2 10 13 1 9 14
输入 2
3 1 3
输出 2
0
说明
第一个样例测试对应于题目描述中给出的示例操作。在第二个样例中,不需要进行任何操作,因为 $A_n = B$。