#include <bits/stdc++.h>
const int N = 55;
using namespace std;
char a[N], b[N];
char from[N], to1[N], to2[N];
bitset<26> zippableA[N][N], zippableB[N][N];
int f[N][N];
int nTrans;
void minimize(int &a, int b) { a = a > b ? b : a; }
void dpPreProcess(char s[N], bitset<26> zippable[N][N]) {
  int n = strlen(s);
  for (int i = (0); i < (n); i++) zippable[i][i][s[i] - 'a'] = 1;
  for (int len = (1); len < (n); len++)
    for (int i = (0); i < (n); i++) {
      int j = i + len;
      if (j >= n) break;
      for (int k = (i); k < (j); k++)
        for (int t = (0); t < (nTrans); t++)
          if (zippable[i][k][to1[t]] && zippable[k + 1][j][to2[t]])
            zippable[i][j][from[t]] = 1;
    }
}
int main() {
  ios ::sync_with_stdio(0);
  cin.tie(0);
  cin >> a >> b >> nTrans;
  char ch;
  for (int i = (0); i < (nTrans); i++) {
    cin >> from[i] >> ch >> ch >> to1[i] >> to2[i];
    from[i] -= 'a';
    to1[i] -= 'a';
    to2[i] -= 'a';
  }
  dpPreProcess(a, zippableA);
  dpPreProcess(b, zippableB);
  int na = strlen(a), nb = strlen(b);
  for (int i = (0); i <= (na); i++)
    for (int j = (0); j <= (nb); j++) f[i][j] = N;
  f[0][0] = 0;
  for (int i = (0); i < (na); i++)
    for (int j = (0); j < (nb); j++)
      if (f[i][j] < N) {
        for (int ii = (i); ii < (na); ii++)
          for (int jj = (j); jj < (nb); jj++)
            if (zippableA[i][ii].to_ulong() & zippableB[j][jj].to_ulong())
              minimize(f[ii + 1][jj + 1], f[i][j] + 1);
      }
  cout << (f[na][nb] < N ? f[na][nb] : -1) << endl;
  return 0;
}
