#include <bits/stdc++.h>
using namespace std;
int dp[2][50 + 5][50 + 5];
int f[50 + 5][50 + 5];
string s1, s2, s;
struct node {
  int a, b, c;
} g[50 + 5];
int main() {
  int n, i, j, r, k, i1, j1;
  cin >> s1;
  cin >> s2;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    cin >> s;
    g[i].a = s[0] - 'a';
    g[i].b = s[3] - 'a';
    g[i].c = s[4] - 'a';
  }
  for (i = 1; i <= s1.length(); i++) dp[0][i][i] = (1 << int(s1[i - 1] - 'a'));
  for (r = 2; r <= s1.length(); r++)
    for (i = 1; i + r - 1 <= s1.length(); i++) {
      j = i + r - 1;
      for (k = i; k < j; k++)
        for (i1 = 1; i1 <= n; i1++)
          if ((dp[0][i][k] & (1 << g[i1].b)) != 0 &&
              (dp[0][k + 1][j] & (1 << g[i1].c)) != 0)
            dp[0][i][j] |= (1 << g[i1].a);
    }
  for (i = 1; i <= s2.length(); i++) dp[1][i][i] = (1 << int(s2[i - 1] - 'a'));
  for (r = 2; r <= s2.length(); r++)
    for (i = 1; i + r - 1 <= s2.length(); i++) {
      j = i + r - 1;
      for (k = i; k < j; k++)
        for (i1 = 1; i1 <= n; i1++)
          if ((dp[1][i][k] & (1 << g[i1].b)) != 0 &&
              (dp[1][k + 1][j] & (1 << g[i1].c)) != 0)
            dp[1][i][j] |= (1 << g[i1].a);
    }
  memset(f, 63, sizeof(f));
  f[0][0] = 0;
  for (i = 1; i <= s1.length(); i++)
    for (j = 1; j <= s2.length(); j++) {
      for (i1 = 0; i1 < i; i1++)
        for (j1 = 0; j1 < j; j1++)
          if (dp[0][i1 + 1][i] & dp[1][j1 + 1][j])
            f[i][j] = min(f[i][j], f[i1][j1] + 1);
    }
  if (f[s1.length()][s2.length()] >= 1e5) {
    printf("-1\n");
    return 0;
  }
  printf("%d\n", f[s1.length()][s2.length()]);
}
