#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100, Z = 1 << 6, D = 6;
char s[N];
bool v[N][D], nemp[N];
int un[Z][N], ct[Z], sz[Z];
bool check() {
  for (int i = 1; i < Z; i++) {
    if (ct[i] > sz[i]) {
      return false;
    }
  }
  return true;
}
void add(int i, int d) {
  int g = Z - 1 - (1 << i);
  for (int j = g;; j = (j - 1) & g) {
    ct[j | (1 << i)] += d;
    if (j == 0) break;
  }
}
int main() {
  int n, m;
  scanf("%s%d", s, &m);
  n = strlen(s);
  for (int i = 0; i < m; i++) {
    int p;
    char t[7];
    scanf("%d %s", &p, t);
    p--;
    for (int j = strlen(t) - 1; j >= 0; j--) {
      v[p][t[j] - 'a'] = 1;
    }
    nemp[p] = 1;
  }
  for (int i = 0; i < n; i++) {
    if (!nemp[i]) {
      for (int j = 0; j < D; j++) v[i][j] = 1;
    }
    for (int j = 0; j < D; j++) {
      if (v[i][j]) {
        un[1 << j][i]++;
        sz[1 << j]++;
      }
    }
    ct[1 << (s[i] - 'a')]++;
  }
  for (int i = 0; i < Z; i++) {
    if ((i & -i) != i) {
      ct[i] = ct[i & -i] + ct[i ^ (i & -i)];
      for (int j = 0; j < n; j++) {
        for (int k = 0; k < D; k++) {
          if ((i >> k) & 1) un[i][j] += un[1 << k][j];
        }
      }
      for (int j = 0; j < n; j++) {
        sz[i] += un[i][j] > 0;
      }
    }
  }
  string r;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < Z; j++) {
      for (int k = 0; k < D; k++) {
        if (((j >> k) & 1) && v[i][k]) {
          un[j][i]--;
          if (un[j][i] == 0) sz[j]--;
        }
      }
    }
    for (int j = 0; j < D; j++) {
      if (v[i][j] && ct[1 << j]) {
        add(j, -1);
        if (check()) {
          r.push_back(j + 'a');
          break;
        }
        add(j, 1);
      }
    }
  }
  if (r.empty())
    printf("Impossible");
  else
    printf("%s", r.c_str());
  return 0;
}
