/*
TASK:LDIST
LANG:C++
*/
#include<iostream.h>
#include<string.h>
 int n,m,l,k;
 long minsum=200000,csum=0;
 char A[1024],B[1024];
 struct v{
 char a;
 int c;
 }*V;
 struct d{
 char a,b;
 int c;
 }*D;
 void solve(int i, int j);
 int main()
 {
  int i;
  cin>>l;
  V=new struct v [l];
  for(i=0;i<l;i++)cin>>V[i].a>>V[i].c;
  cin>>k;
  D=new struct d [k];
  for(i=0;i<k;i++)cin>>D[i].a>>D[i].b>>D[i].c;
  cin>>A>>B;
  n=strlen(A); m=strlen(B);
  solve(0,0);
  cout<<minsum<<endl;
  return 0;
 }

 void solve(int i, int j)
 {
  int p;
  char t;
  if(i>=n && j>=m){minsum=csum; return;}
  if(i>=n){
    for(p=0,t=0;p<l && t==0;p++)
     if(V[p].a==B[j]){
      csum+=V[p].c; t=1; if(csum<minsum)solve(i,j+1); csum-=V[p].c;
     }
    if(!t){csum+=100; if(csum<minsum)solve(i,j+1); csum-=100;}
   return;
  }
  if(j>=m){
   for(p=0,t=0;p<l && t==0;p++)
    if(V[p].a==A[i]){
     csum+=V[p].c; t=1; if(csum<minsum)solve(i+1,j); csum-=V[p].c;
    }
   if(!t){csum+=100; if(csum<minsum)solve(i+1,j); csum-=100;}
   return;
   }
  if(A[i]==B[j]){solve(i+1,j+1); return;}
  if(!(A[i+2]!=A[i+1] && A[i]==B[j+1])){
  for(p=0,t=0;p<k && t==0;p++)
   if((D[p].a==B[j] || D[p].b==B[j]) && (D[p].a==A[i] || D[p].b==A[i])){
    csum+=D[p].c; if(csum<minsum)solve(i+1,j+1); csum-=D[p].c; t=1;
   }
  if(!t){csum+=100; if(csum<minsum)solve(i+1,j+1); csum-=100;}
  }
  for(p=0;p<l;p++)
  if(V[p].a==B[j])
  {
   csum+=V[p].c;
   if(csum<minsum)solve(i,j+1);
   csum-=V[p].c;
  }
  for(p=0;p<l;p++)
  if(V[p].a==A[i])
  {
   csum+=V[p].c;
   if(csum<minsum)solve(i+1,j);
   csum-=V[p].c;
  }
 }