代码:
t = int(input()) # 输入数据组数
for i in range(t): # 循环处理每组数据
### 变量定义 & 数据读取 ###
flag = True # 是否有解
name_num = int(input()) # 名字数量
name = input().split() # 储存每个人名字的列表
mes_num = int(input()) # 消息数量
mes = [] # 储存每条消息的列表
# 循环读入每条消息
for i in range(mes_num):
mes.append(input())
ImpossibleName = [] # ImpossibleName的最后一个元素(即ImpossibleName[-1])表示下一条消息不可能的发布者
ans = [] # 储存完整的消息(即输出的内容)
pos = 0 # 表示现在遍历到第pos条消息
### 数据处理 ###
for i in mes: # 循环遍历每条消息
pos += 1 # 遍历的消息条数+1
if not flag: break # 如果已经判定无解了就立即退出循环
if i[0] == '?': # 如果未知该条消息的发布者
## PossibleName 初始化 ##
# PossibleName列表表示每条消息可能的发布者
PossibleName = name.copy() # PossibleName列表初始状态为所有人(因为一开始所有人都可能是这条消息的发布者)
## 检查上文
# 如果ImpossibleName里面有元素(即有这一条消息不可能的发布者),就把ImpossibleName里的元素从PossibleName里面删除
if len(ImpossibleName): PossibleName.remove(ImpossibleName[-1])
## 检查下文
if pos != mes_num:# 如果该条消息不是最后一条消息
if mes[pos][0] != '?': # 如果已知下一条消息的发布者
# 因为一个人不会连续发两条消息,所以下一条消息的发布者不可能是这条消息的发布者
# 所以要将下一条消息的发布者的名字从PossibleName里面删除
PossibleName.remove(mes[pos][:mes[pos].find(':')])
for j in name: # 循环遍历所有人的名字
if j in i and j in PossibleName: # 如果这条消息里有某个人的名字 且 这个人的名字在PossibleName里面
PossibleName.remove(j) # 就把这个人的名字从PossibleName里面删除
# 如果PossibleName里面的元素个数不为一(即这条消息没有可能的发布者或者有多个可能的发布者,即这条消息可能的发布者不唯一)
if len(PossibleName) != 1:
# 就判定无解
print("Impossible")
flag = False
else: # 如果PossibleName里面的元素个数为一(即这条消息只有一个可能的发布者,即这条消息可能的发布者唯一)
ans.append("%s%s" % (PossibleName[0],i[i.find(':'):])) # 将这条消息储存到完整的消息列表(即输出的内容)里
# 因为一个人不会连续发两条消息,所以这条消息的发布者不可能是下一条消息的发布者
# 所以要将这条消息的发布者的名字添加到ImpossibleName(即下一条条消息不可能的发布者)里
ImpossibleName.append(PossibleName[0])
else: # 如果已知该条消息的发布者
# 因为一个人不会连续发两条消息,所以这条消息的发布者不可能是下一条消息的发布者
# 所以要将这条消息的发布者的名字添加到ImpossibleName(即下一条条消息不可能的发布者)里
ImpossibleName.append(i[:i.find(':')])
ans.append(i) # 将这条消息储存到完整的消息列表(即输出的内容)里
### 输出 ###
if flag: # 如果有解
# 循环遍历输出ans列表(即完整的消息列表)
for i in ans:
print(i)