#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10;
const int MA = 27, MN = 55;
string S, P;
bool can[2][MA][MN][MN];
vector<pair<int, int> > rule[MA];
int q, n;
int dp[MN][MN];
void solve(int id, string s) {
  n = ((int)(s).size());
  for (int sz = 0; sz < n; ++sz)
    for (int l = 0; l + sz < n; ++l) {
      int r = l + sz;
      if (l == r) {
        can[id][s[l] - 'a'][l][r] = true;
        continue;
      }
      for (int d = 0; d < 26; ++d) {
        for (int i = l; i < r && !can[id][d][l][r]; ++i)
          for (auto x : rule[d]) {
            if (can[id][x.first][l][i] && can[id][x.second][i + 1][r]) {
              can[id][d][l][r] = true;
              break;
            }
          }
      }
    }
}
int main() {
  ios_base ::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> S >> P;
  cin >> q;
  for (int i = 0; i < q; ++i) {
    string str;
    cin >> str;
    rule[str[0] - 'a'].push_back({str[3] - 'a', str[4] - 'a'});
  }
  solve(0, S);
  solve(1, P);
  for (int i = 0; i < MN; ++i) fill(dp[i], dp[i] + MN, INF);
  dp[0][0] = 0;
  for (int i = 0; i < ((int)(S).size()); ++i)
    for (int j = 0; j < ((int)(P).size()); ++j) {
      for (int l1 = 0; l1 <= i; ++l1)
        for (int l2 = 0; l2 <= j; ++l2)
          for (int d = 0; d < 26; ++d) {
            if (can[0][d][l1][i] && can[1][d][l2][j]) {
              dp[i + 1][j + 1] = min(dp[i + 1][j + 1], 1 + dp[l1][l2]);
            }
          }
    }
  int ans = dp[((int)(S).size())][((int)(P).size())];
  cout << (ans >= INF ? -1 : ans) << '\n';
  return 0;
}
