```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
var s string
if _, err := fmt.Fscan(in, &s); err != nil {
return
}
var m int
if _, err := fmt.Fscan(in, &m); err != nil {
return
}
n := len(s)
maskOfPos := make([]int, n+1)
for i := 1; i <= n; i++ {
maskOfPos[i] = 63
}
for i := 0; i < m; i++ {
var pos int
var allowed string
fmt.Fscan(in, &pos, &allowed)
mask := 0
for j := 0; j < len(allowed); j++ {
mask |= 1 << (allowed[j] - 'a')
}
maskOfPos[pos] = mask
}
cnt := make([]int, 6)
for i := 0; i < n; i++ {
cnt[s[i]-'a']++
}
C := make([]int, 64)
for i := 1; i <= n; i++ {
C[maskOfPos[i]]++
}
sum_C := make([]int, 64)
for X := 0; X < 64; X++ {
for S := 0; S < 64; S++ {
if (S&X) == S {
sum_C[X] += C[S]
}
}
}
sum_cnt := make([]int, 64)
for X := 0; X < 64; X++ {
for i := 0; i < 6; i++ {
if (X&(1<<i)) != 0 {
sum_cnt[X] += cnt[i]
}
}
}
for X := 0; X < 64; X++ {
if sum_cnt[X] < sum_C[X] {
fmt.Println("Impossible")
return
}
}
ans := make([]byte, n)
for i := 1; i <= n; i++ {
mask := maskOfPos[i]
placed := false
for c := 0; c < 6; c++ {
if (mask&(1<<c)) != 0 && cnt[c] > 0 {
valid := true
for X := 0; X < 64; X++ {
req := sum_C[X]
if (X&mask) == mask {
req--
}
avail := sum_cnt[X]
if (X&(1<<c)) != 0 {
avail--
}
if avail < req {
valid = false
break
}
}
if valid {
cnt[c]--
for X := 0; X < 64; X++ {
if (X&mask) == mask {
sum_C[X]--
}
if (X&(1<<c)) != 0 {
sum_cnt[X]--
}
}
ans[i-1] = byte(c + 'a')
placed = true
break
}
}
}
if !placed {
fmt.Println("Impossible")
return
}
}
fmt.Println(string(ans))
}
```