#include <bits/stdc++.h>
constexpr int CMAX = 26;
constexpr int LMAX = 10000;
inline uint32_t Ord(char c) { return c - 'a'; }
uint32_t transits[CMAX][CMAX];
uint32_t combine_transit(uint32_t t1, uint32_t t2) {
  uint32_t ret = 0;
  uint32_t arr_t2[CMAX];
  int t2_s = 0;
  for (int i = 0; i < CMAX; ++i) {
    if (t2 & (uint32_t(1) << uint32_t(i))) {
      arr_t2[t2_s++] = i;
    }
  }
  for (int i = 0; i < CMAX; ++i) {
    if (t1 & (uint32_t(1) << uint32_t(i))) {
      for (int j = 0; j < t2_s; ++j) {
        ret |= transits[i][arr_t2[j]];
      }
    }
  }
  return ret;
}
std::vector<std::vector<int>> dist_cache;
std::vector<std::vector<uint32_t>> t1, t2;
void get_reduce(std::string& str, std::vector<std::vector<uint32_t>>& t) {
  int l = str.size();
  t.resize(l + 1, std::vector<uint32_t>(l, 0));
  for (int l2 = 1; l2 <= l; ++l2) {
    t[l2][l2 - 1] = 1 << Ord(str[l2 - 1]);
    for (int l1 = l2 - 2; l1 >= 0; --l1) {
      for (int n1 = l1 + 1; n1 < l2; ++n1) {
        uint32_t t1 = t[n1][l1];
        uint32_t t2 = t[l2][n1];
        t[l2][l1] |= combine_transit(t1, t2);
      }
    }
  }
}
int dfs(int l1, int l2) {
  if (l1 == 0) {
    if (l2 != 0) {
      return LMAX;
    }
    return 0;
  }
  if (dist_cache[l1][l2] != LMAX + 1) {
    return dist_cache[l1][l2];
  }
  int n = LMAX;
  for (int n1 = 0; n1 < l1; ++n1) {
    for (int n2 = 0; n2 < l2; ++n2) {
      if (t1[l1][n1] & t2[l2][n2]) {
        int d = dfs(n1, n2);
        n = std::min(d + 1, n);
      }
    }
  }
  return dist_cache[l1][l2] = n;
}
int main() {
  std::string str1;
  std::string str2;
  std::cin >> str1;
  std::cin >> str2;
  int n;
  std::cin >> n;
  while (n--) {
    std::string str;
    std::cin >> str;
    transits[Ord(str[3])][Ord(str[4])] |= uint32_t(1) << Ord(str[0]);
  }
  get_reduce(str1, t1);
  get_reduce(str2, t2);
  int l1 = str1.size();
  int l2 = str2.size();
  dist_cache.resize(l1 + 1, std::vector<int>(l2 + 1, LMAX + 1));
  int d = dfs(l1, l2);
  std::cout << (d != LMAX ? d : -1) << std::endl;
}
