#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
template <class T, class S>
ostream &operator<<(ostream &o, const pair<T, S> &p) {
  return o << '(' << p.first << ", " << p.second << ')';
}
template <template <class, class...> class T, class... A>
typename enable_if<!is_same<T<A...>, string>(), ostream &>::type operator<<(
    ostream &o, T<A...> V) {
  o << '[';
  for (auto a : V) o << a << ", ";
  return o << ']';
}
long long int dist[26][26];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  string a;
  cin >> a;
  string b;
  cin >> b;
  for (long long int i = 0; i < 26; i++)
    for (long long int j = 0; j < 26; j++) dist[i][j] = 10000000000007;
  for (long long int i = 0; i < 26; i++) dist[i][i] = 0;
  long long int n;
  cin >> n;
  while (n--) {
    string s;
    cin >> s;
    string t;
    cin >> t;
    long long int c;
    cin >> c;
    dist[s[0] - 'a'][t[0] - 'a'] = min(dist[s[0] - 'a'][t[0] - 'a'], c);
  }
  for (long long int k = 0; k < 26; k++)
    for (long long int i = 0; i < 26; i++)
      for (long long int j = 0; j < 26; j++)
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  string cd = "";
  long long int ans = 0;
  for (long long int i = 0; i < a.size(); i++) {
    long long int mi = LLONG_MAX;
    char mc = 'a';
    for (long long int c = 0; c < 26; c++) {
      if (dist[a[i] - 'a'][c] + dist[b[i] - 'a'][c] < mi) {
        mc = c;
        mi = dist[a[i] - 'a'][c] + dist[b[i] - 'a'][c];
      }
    }
    cd += (char)(mc + 'a');
    ans += mi;
  }
  if (ans >= 10000000000007 || a.size() != b.size())
    cout << -1 << '\n';
  else
    cout << ans << '\n' << cd << '\n';
}
