#include <bits/stdc++.h>
using namespace std;
typedef bool mat[55][55][35];
mat adja, adjb;
char a[55], b[55], x[55], y[55], z[55];
int dp[55][55], k;
inline void upd(int &u, int v) { u = min(u, v); }
inline void work(char *str, int n, mat adj) {
  memset(adj, false, 55 * 55 * 35);
  for (int i = 0; i < n; i++) adj[i][i][str[i] - 'a'] = true;
  for (int len = 1; len < n; len++) {
    for (int l = 0; l + len < n; l++) {
      int r = l + len;
      for (int p = l; p < r; p++) {
        for (int i = 0; i < k; i++)
          adj[l][r][x[i] - 'a'] |=
              adj[l][p][y[i] - 'a'] & adj[p + 1][r][z[i] - 'a'];
      }
    }
  }
}
int main() {
  scanf("%s%s%d", a, b, &k);
  int n = strlen(a), m = strlen(b);
  for (int i = 0; i < k; i++) scanf("%*c%c%*c%*c%c%c", x + i, y + i, z + i);
  work(a, n, adja);
  work(b, m, adjb);
  memset(dp, 0x3f, sizeof(dp));
  dp[0][0] = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      for (int t = 0; t < 26; t++) {
        for (int u = i; u < n; u++) {
          for (int v = j; v < m; v++) {
            if (adja[i][u][t] && adjb[j][v][t])
              upd(dp[u + 1][v + 1], dp[i][j] + 1);
          }
        }
      }
    }
  }
  printf("%d\n", dp[n][m] == 0x3f3f3f3f ? -1 : dp[n][m]);
  return 0;
}
