#CF1009G. 允许的字母

允许的字母

G. 允许的字母
每次测试时间限制:2 秒
每次测试内存限制:256 兆字节


题目描述

Polycarp 刚刚启动了他的新创业项目。市场空间很大,发展方向也很明确,所以他很快就找到了一些愿意赞助公司的投资人。不过,他还没有给公司起好名字!

实际上,Polycarp 已经想好了一个名字,但名字总是越改越好。因此,他希望通过交换名字中某些位置的字母来得到一个更好的名字。字母不一定要相邻才能交换。

此外,每位投资人都选择了名字中的一个位置,并指定了该位置上可以出现的字母集合。不同投资人选择的位置互不相同。如果某个位置没有被任何投资人选择,那么该位置可以出现任何字母。

最后,Polycarp 认为字典序最小的名字是最好的。(就像 Google 为什么改名为 Alphabet 一样?)

更正式地说,给定一个由小写拉丁字母 'a''f' 组成的字符串。你可以在任意位置之间任意次地交换字母(也可以不交换)。

你需要得到的名字要满足:每个位置上的字母都在该位置允许的字母集合中。

请输出能够得到的字典序最小的名字。

如果无法得到任何合法的名字,则输出 "Impossible"


输入格式

第一行是一个字符串 ss1s1051 \le |s| \le 10^5)—— Polycarp 最初想出的名字。字符串仅由小写字母 'a''f' 组成。

第二行是一个整数 mm0ms0 \le m \le |s|)—— 投资人的数量。

接下来的 mm 行中,第 ii 行包含一个整数 posipos_i 和一个非空的允许字符组成的字符串(1posis1 \le pos_i \le |s|)。该字符串中的字母是 'a''f' 且互不相同。
pos1,pos2,,posmpos_1, pos_2, \dots, pos_m 互不相同。
如果某个位置没有出现在投资人的要求中,则该位置允许任何字母。


输出格式

如果无法得到任何合法的名字,输出 "Impossible"

否则,输出通过交换 ss 中的字母得到的字典序最小的字符串,且每个位置上的字母都在该位置允许的集合中。


示例

示例输入 1

bedefead
5
2 e
1 dc
5 b
7 ef
6 ef

示例输出 1

deadbeef

示例输入 2

abacaba
0

示例输出 2

aaaabbc

示例输入 3

fc
2
1 cfab
2 f

示例输出 3

cf