def C(N, K): ANS = 1 for k in range(K): ANS = ANS * (N - k) // (k + 1) return ANS def count(N, M): if M < N: return 0 # 1<=A[i]<=M return C(M, N) def binary_search(check, ok, ng): while abs(ok-ng) > 1: mid = (ok+ng)//2 if check(mid): ok = mid else: ng = mid return ok def to_rank(A): if not A: return 0 N = len(A) a = A.pop() ANS = count(N, a - 1) ANS += to_rank(A) return ANS def from_rank(N, rank): if N == 0: assert rank == 0 return [] def check(a): return count(N, a) <= rank a = binary_search(check, 0, 10**9) rank -= count(N, a) A = from_rank(N - 1, rank) A.append(a + 1) return A from_rank(1, 1) # for n in range(120): # A = from_rank(3, n) # m = to_rank(A) # print(n, A, m) def ALICE(): N, Q = map(int, input().split()) A = [int(x) for x in input().split()] M = to_rank(A) S = bin(M)[2:] print(1) print(S) def BOB(): N, Q = map(int, input().split()) K = int(input()) for _ in range(K): X = input() X = int(X, 2) A = from_rank(N, X) print(*A) P = input() if P[0] == "A": ALICE() else: BOB()