#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:60777216")
using namespace std;
inline string sbstr(string s, int i, int j) { return s.substr(i, j - i + 1); }
const double EPS = 1e-9;
const int IINF = 1000000000;
const double PI = acos(-1.0);
const long long LINF = 6000000000000000000LL;
int main() {
  string s1, s2;
  while (cin >> s1 >> s2) {
    int m;
    scanf("%d", &m);
    vector<vector<int> > d(26, vector<int>(26, IINF));
    for (int i = 0; i < m; ++i) {
      int w;
      char ch1, ch2;
      cin >> ch1 >> ch2 >> w;
      d[ch1 - 'a'][ch2 - 'a'] = min(d[ch1 - 'a'][ch2 - 'a'], w);
    }
    if (s1.size() != s2.size()) {
      printf("-1\n");
      continue;
    }
    for (int i = 0; i < 26; ++i) {
      d[i][i] = 0;
    }
    for (int k = 0; k < 26; ++k) {
      for (int i = 0; i < 26; ++i) {
        for (int j = 0; j < 26; ++j) {
          d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
        }
      }
    }
    int answer = 0;
    bool exists = true;
    for (int i = 0; i < s1.size() && exists; ++i) {
      int mmin = IINF, pos = -1;
      int a = s1[i] - 'a', b = s2[i] - 'a';
      for (int c = 0; c < 26; ++c) {
        if (d[a][c] + d[b][c] < mmin) {
          pos = c;
          mmin = d[a][c] + d[b][c];
        }
      }
      if (mmin == IINF) {
        printf("-1\n");
        exists = false;
      }
      answer += mmin;
      s1[i] = pos + 'a';
    }
    if (exists) {
      cout << answer << endl << s1 << endl;
    }
  }
  return 0;
}
