#include <bits/stdc++.h>
using namespace std;
const int N = 0 + 57, ALPHA = 28, INF = 177;
int n, m, k;
bool can[2][ALPHA][N][N];
char S[2][N];
int dp[N][N];
vector<pair<int, int> > V[ALPHA];
int main() {
  scanf("%s %s", S[0] + 1, S[1] + 1);
  n = strlen(S[0] + 1);
  m = strlen(S[1] + 1);
  scanf("%d", &k);
  for (int i = 1; i <= k; ++i) {
    char x, y, z;
    scanf(" %c-> %c %c", &x, &y, &z);
    V[x - 'a'].push_back(make_pair(y - 'a', z - 'a'));
  }
  for (int id = 0; id < 2; ++id)
    for (int len = 1; len <= n; ++len)
      for (int le = 1; le + len - 1 <= (id == 0 ? n : m); ++le)
        for (int c = 0; c < ALPHA; ++c) {
          int ri = le + len - 1;
          if (le == ri) {
            can[id][c][le][ri] = (S[id][le] - 'a' == c);
            continue;
          }
          for (auto x : V[c]) {
            for (int mid = le; mid < ri; ++mid)
              can[id][c][le][ri] |=
                  (can[id][x.first][le][mid] && can[id][x.second][mid + 1][ri]);
          }
        }
  memset(dp, 63, sizeof(dp));
  dp[0][0] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      for (int l = 1; l <= i; ++l)
        for (int r = 1; r <= j; ++r)
          for (int c = 0; c < ALPHA; ++c)
            dp[i][j] = min(dp[i][j],
                           dp[l - 1][r - 1] +
                               (can[0][c][l][i] && can[1][c][r][j] ? 1 : INF));
  if (dp[n][m] > min(n, m)) dp[n][m] = -1;
  printf("%d\n", dp[n][m]);
  return 0;
}
