## https://yukicoder.me/problems/no/1780 ALPHA_NUM = 26 NODE_NUM = 16 MIN_INT = -float("inf") def main(): C = list(map(int, input().split())) K = list(map(int, input().split())) N = int(input()) S = [] for _ in range(N): s, a, b, e = input().split() S.append((s, int(a), int(b), int(e))) # matrix構築 matrix_list = [[[MIN_INT for _ in range(NODE_NUM)] for _ in range(NODE_NUM)] for _ in range(ALPHA_NUM)] for i in range(ALPHA_NUM): for j in range(NODE_NUM): matrix_list[i][j][j] = 0 for i in range(N): s, a, b, e = S[i] s = set([s0 for s0 in s]) a -= 1 b -= 1 for s0 in s: s1 = ord(s0) - ord("A") matrix_list[s1][a][b] = max(matrix_list[s1][a][b], e) matrix_list[s1][b][a] = max(matrix_list[s1][b][a], e) def prod_vector(matrix, vector): new_vector = [MIN_INT for _ in range(NODE_NUM)] for i in range(NODE_NUM): for j in range(NODE_NUM): new_vector[i] = max(new_vector[i], matrix[i][j] + vector[j]) return new_vector def prod_matrix(left, right): new_matrix = [[MIN_INT for _ in range(NODE_NUM)] for _ in range(NODE_NUM)] for i in range(NODE_NUM): for j in range(NODE_NUM): for k in range(NODE_NUM): new_matrix[i][j] = max(new_matrix[i][j], left[i][k] + right[k][j]) return new_matrix dp_list = [] for alpha in range(ALPHA_NUM): k = K[alpha] vector = [MIN_INT for _ in range(NODE_NUM)] vector[C[alpha] - 1] = 0 base_matrix = matrix_list[alpha] while k > 0: if k % 2 == 1: vector = prod_vector(base_matrix, vector) base_matrix = prod_matrix(base_matrix, base_matrix) k //= 2 dp_list.append(vector) # 答え answer = MIN_INT for target_color in range(NODE_NUM): is_ok = True value = 0 for alpha in range(ALPHA_NUM): if dp_list[alpha][target_color] == MIN_INT: is_ok = False break else: value += dp_list[alpha][target_color] if is_ok: answer = max(answer, value) if answer == MIN_INT: print("Impossible") else: print(answer) if __name__ == '__main__': main()