/*
TASK: LDIST
LANG: C++
*/

#include <stdio.h>
#include <string.h>

const int MAX_ch = 200;
const int MAX_N  = 1030;

int V[MAX_ch];           // vidimost
int D[MAX_ch][MAX_ch];   // distance

char A[MAX_N];           // alpha
char B[MAX_N];           // beta

int P[MAX_N][MAX_N];     // the main matrix

inline int min (int a, int b)
{ return ((a)<(b))?(a):(b); }

inline int min (int a, int b, int c)
{ return min(a,min(b,c)); }


void init ()
{
   int i, j;

   for (i=0; i<MAX_ch; i++) V[i]=100;
   
   for (i=0; i<MAX_ch; i++)
      for (j=0; j<MAX_ch; j++)
         D[i][j] = 100;
}

void input ()
{
   int i, p, q;
   char a, c;
   int b;

   scanf ("%d\n", &p);

   for (i=0; i<p; i++) {
      scanf ("%c %d\n", &a, &b);
      V[a] = b;
   }

   scanf ("%d\n", &q);

   for (i=0; i<q; i++) {
      scanf ("%c %c %d\n", &a, &c, &b);
      D[a][c] = D[c][a] = b;
   }

   scanf ("%s\n", A);
   scanf ("%s\n", B);
}

void solve ()
{
   int i, j;
   int n = strlen (A);
   int m = strlen (B);

   for (i=n-1; i>=0; i--)
      for (j=m-1; j>=0; j--)
         if (A[i] == B[j]) P[i][j] = P[i+1][j+1];
         else {
            P[i][j] = min (P[i][j+1]+V[ B[j] ], P[i+1][j]+V[ A[i] ]); // delete
            P[i][j] = min (P[i][j], P[i+1][j+1]+D[ A[i] ][ B[j] ]); // update
//            P[i][j] = min (P[i][j], ); // insert
         }

}

void output ()
{
   printf ("%d\n", P[0][0]);
}

int main ()
{
   freopen ("ldist.in", "r", stdin);

   init ();
   input ();
   solve ();
   output ();

   return 0;
}
