#include <bits/stdc++.h>
using namespace std;
const long long h1 = 999999937;
const long long h2 = 1000000009;
const int inf = 2e9;
const long long mod = 1000000007;
const int dx[] = {1, 0, -1, 0, 1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1, 1, 0, -1, 0};
const double pi = 3.141592653589793;
const bool multitests = false, alotoftests = false;
stringstream sinout;
string s, t, ans;
int n, d[128][128], ansx;
vector<int> v;
void init() {
  for (int i = 0; i < (128); i++)
    for (int j = 0; j < (128); j++) d[i][j] = inf / 10;
}
void floyd() {
  for (int ki = 0; ki <= 100; ki++) {
    for (int i = 'a'; i <= 'z'; ++i) {
      for (int j = 'a'; j <= 'z'; ++j) {
        for (int k = 'a'; k <= 'z'; ++k) {
          if (d[i][k] + d[k][j] < d[i][j]) {
            d[i][j] = d[i][k] + d[k][j];
          }
        }
      }
    }
  }
  for (int i = 'a'; i <= 'z'; ++i) {
    d[i][i] = 0;
  }
}
int main() {
  init();
  cin >> s >> t;
  ans.resize(s.size());
  if ((int)s.size() != (int)t.size()) {
    return cout << -1 << endl, 0;
    ;
  }
  cin >> n;
  for (int i = 0; i < (n); i++) {
    char a, b;
    int c;
    cin >> a >> b >> c;
    d[a][b] = min(d[a][b], c);
  }
  floyd();
  for (int i = 0; i < ((int)s.size()); i++) {
    if (s[i] != t[i]) {
      v.push_back(i);
    } else {
      ans[i] = s[i];
    }
  }
  for (int i = 0; i < ((int)v.size()); i++) {
    int x = v[i], y = inf / 2;
    for (int i = 'a'; i <= 'z'; ++i) {
      if (d[s[x]][i] == inf / 10 || d[t[x]][i] == inf / 10) {
        continue;
      }
      if (d[s[x]][i] + d[t[x]][i] < y) {
        y = d[s[x]][i] + d[t[x]][i];
        ans[x] = i;
      }
    }
    if (y == inf / 2) {
      return cout << -1 << endl, 0;
      ;
    }
    ansx += y;
  }
  cout << ansx << endl << ans << endl;
  return 0;
}
