#include <bits/stdc++.h>
using namespace std;
char str1[60];
char str2[60];
int s1[60];
int s2[60];
int len1, len2;
int dp[60][60];
int dp1[60][60];
int dp2[60][60];
struct Node {
  int x, y, z;
  void in() {
    scanf("%s", str1);
    x = str1[3] - 'a';
    y = str1[4] - 'a';
    z = str1[0] - 'a';
  }
} p[60];
int n;
int dfs1(int x, int y) {
  if (dp1[x][y] != -1) return dp1[x][y];
  if (x == y) {
    dp1[x][y] = 1 << s1[x];
    return dp1[x][y];
  }
  dp1[x][y] = 0;
  for (int z = x; z < y; z++)
    for (int i = 0; i < n; i++)
      if ((dfs1(x, z) & (1 << p[i].x)) && (dfs1(z + 1, y) & (1 << p[i].y)))
        dp1[x][y] |= 1 << p[i].z;
  return dp1[x][y];
}
int dfs2(int x, int y) {
  if (dp2[x][y] != -1) return dp2[x][y];
  if (x == y) {
    dp2[x][y] = 1 << s2[x];
    return dp2[x][y];
  }
  dp2[x][y] = 0;
  for (int z = x; z < y; z++)
    for (int i = 0; i < n; i++)
      if ((dfs2(x, z) & (1 << p[i].x)) && (dfs2(z + 1, y) & (1 << p[i].y)))
        dp2[x][y] |= 1 << p[i].z;
  return dp2[x][y];
}
int main() {
  scanf("%s", str1);
  scanf("%s", str2);
  len1 = strlen(str1);
  len2 = strlen(str2);
  for (int i = 0; i < len1; i++) s1[i] = str1[i] - 'a';
  for (int i = 0; i < len2; i++) s2[i] = str2[i] - 'a';
  scanf("%d", &n);
  for (int i = 0; i < n; i++) p[i].in();
  memset(dp1, -1, sizeof(dp1));
  memset(dp2, -1, sizeof(dp2));
  for (int i = 0; i <= len1; i++)
    for (int j = 0; j <= len2; j++) dp[i][j] = 0xfffffff;
  dp[0][0] = 0;
  for (int i = 0; i < len1; i++)
    for (int j = 0; j < len2; j++) {
      if (dp[i][j] == 0xfffffff) continue;
      for (int ii = i; ii < len1; ii++)
        for (int jj = j; jj < len2; jj++) {
          if (dfs1(i, ii) & dfs2(j, jj))
            dp[ii + 1][jj + 1] = min(dp[ii + 1][jj + 1], dp[i][j] + 1);
        }
    }
  if (dp[len1][len2] == 0xfffffff)
    printf("-1\n");
  else
    printf("%d\n", dp[len1][len2]);
  return 0;
}
