#include <bits/stdc++.h>
using namespace std;
const int maxn = 60;
int m;
struct Tcxx {
  int a, b, c;
  inline void set(int _a, int _b, int _c) { a = _a, b = _b, c = _c; }
} E[maxn];
struct Tdp {
  char A[maxn];
  int n;
  bool F[26][maxn][maxn];
  void init() { scanf("%s", A + 1), n = strlen(A + 1); }
  void set() {
    int l, i, j, k;
    Tcxx *p;
    for (i = 1; i <= n; ++i) F[A[i] - 'a'][i][i] = true;
    for (l = 2; l <= n; ++l)
      for (i = 1; j = i + l - 1, j <= n; ++i) {
        for (k = i; k < j; ++k)
          for (p = E; p < E + m; ++p)
            if (F[p->a][i][k] && F[p->b][k + 1][j]) F[p->c][i][j] = true;
      }
  }
} A, B;
namespace Ninit {
char s[maxn];
void init() {
  int i;
  A.init(), B.init();
  scanf("%d", &m);
  for (i = 0; i < m; ++i)
    scanf("%s", s), E[i].set(s[3] - 'a', s[4] - 'a', s[0] - 'a');
}
}  // namespace Ninit
namespace Nsolve {
int F[maxn][maxn];
void solve() {
  int i, j, k, p, q;
  A.set(), B.set();
  memset(F, 54, sizeof F), F[0][0] = 0;
  for (i = 1; i <= A.n; ++i)
    for (j = 1; j <= B.n; ++j)
      for (k = 0; k < 26; ++k)
        for (p = 1; p <= i; ++p)
          if (A.F[k][p][i])
            for (q = 1; q <= j; ++q)
              if (B.F[k][q][j]) F[i][j] = min(F[i][j], F[p - 1][q - 1] + 1);
  F[A.n][B.n] > 100 ? printf("-1\n") : printf("%d\n", F[A.n][B.n]);
}
}  // namespace Nsolve
int main() {
  Ninit::init();
  Nsolve::solve();
  return 0;
}
