#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1000000;
const int CMAX = 257;
char s1[NMAX];
char s2[NMAX];
char re[NMAX];
int costs[CMAX][CMAX];
char buf[NMAX];
void reads(char *s) {
  gets(s);
  if (!*s) gets(s);
}
long long solve() {
  int len1 = strlen(s1);
  int len2 = strlen(s2);
  if (len1 != len2) return -1;
  long long total_cost = 0;
  for (int i = 0; i < len1; ++i) {
    re[i] = s1[i];
    if (s1[i] != s2[i]) {
      int best_cost = INT_MAX;
      int &cost1 = costs[s2[i]][s1[i]];
      int &cost2 = costs[s1[i]][s2[i]];
      if (cost1 < best_cost) {
        best_cost = cost1;
        re[i] = s1[i];
      }
      if (cost2 < best_cost) {
        best_cost = cost2;
        re[i] = s2[i];
      }
      for (int c = 'a'; c <= 'z'; ++c) {
        int &cost1x = costs[s2[i]][c];
        int &cost2x = costs[s1[i]][c];
        if ((cost1x != INT_MAX) && (cost2x != INT_MAX)) {
          int cost = cost1x + cost2x;
          if (cost < best_cost) {
            best_cost = cost;
            re[i] = c;
          }
        }
      }
      if (best_cost == INT_MAX) return -1;
      total_cost += best_cost;
    }
  }
  return total_cost;
}
int main() {
  for (int c = 0; c < CMAX; ++c) {
    for (int d = 0; d < CMAX; ++d) {
      costs[c][d] = INT_MAX;
      if (c == d) costs[c][d] = 0;
    }
  }
  reads(s1);
  reads(s2);
  int n;
  scanf("%d\n", &n);
  for (int i = 0; i < n; ++i) {
    char a, b;
    int cost;
    gets(buf);
    sscanf(buf, "%c %c %d", &a, &b, &cost);
    if (costs[a][b] > cost) costs[a][b] = cost;
  }
  for (int k = 'a'; k <= 'z'; ++k) {
    for (int i = 'a'; i <= 'z'; ++i) {
      if (costs[i][k] == INT_MAX) continue;
      for (int j = 'a'; j <= 'z'; ++j) {
        if (costs[k][j] == INT_MAX) continue;
        int cost = costs[i][k] + costs[k][j];
        if (costs[i][j] > cost) costs[i][j] = cost;
      }
    }
  }
  long long answer = solve();
  if (-1 == answer) {
    printf("-1\n");
    return 0;
  }
  printf("%lld\n", answer);
  puts(re);
  return 0;
}
