#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;

const double eps = 1e-12;

const double pi =acos(-1.0);

char str[110][110],type[30][5],route[1010][5];

int damage[30],g[110][110],num[1010],p[20],now[10010],temp[10010];

int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};

int main()
{
    int init,maxx,typenum,routenum,i,j,d,ii,k,pp,fuck,cao,flag,n,m,ttemp;
    while(scanf("%d%d",&init,&maxx)==2)
    {
        if(!init&&!maxx)
            break;
        flag=0;
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%s",str[i]);
        scanf("%d",&typenum);
        for(i=1;i<=typenum;i++)
            scanf("%s%d",type[i],&damage[i]);
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                for(k=1;k<=typenum;k++)
                {
                    if(str[i][j]==type[k][0])
                    {
                        g[i][j]=damage[k];
                        break;
                    }
                }
        int nowx=0,nowy=0;
        scanf("%d",&routenum);
        for(i=1;i<=routenum;i++)
            scanf("%s%d",route[i],&num[i]);
        scanf("%d",&pp);
        for(i=0;i<pp;i++)
            scanf("%d",&p[i]);
        for(i=0;i<(1<<pp);i++)
        {
            ttemp=init;
            for(j=0;j<pp;j++)
            {
                if((i&(1<<j))>0)
                   ttemp+=p[j];
            }
            if(ttemp>maxx)
                ttemp=maxx;
            now[i]=ttemp;
        }
        for(i=1;i<=routenum;i++)
        {
            if(route[i][0]=='U')
                d=0;
            if(route[i][0]=='D')
                d=1;
            if(route[i][0]=='L')
                d=2;
            if(route[i][0]=='R')
                d=3;
            for(j=1;j<=num[i];j++)
            {
                nowx=nowx+dx[d];
                nowy=nowy+dy[d];
                fuck=g[nowx][nowy];
                for(k=0;k<(1<<pp);k++)
                    temp[k]=now[k];
                flag=1;
                for(k=0;k<(1<<pp);k++)
                {
                    if(temp[k]==-1)
                        continue;
                    flag=0;
                    for(ii=0;ii<pp;ii++)
                    {
                        if(((1<<ii)&k)==0)
                        {
                            cao=k+(1<<ii);
                            if(now[k]+p[ii]>now[cao])
                                now[cao]=now[k]+p[ii];
                        }
                    }
                }
           //     printf("%d %d %d\n",i,j,flag);
                if(flag==1)
                    break;
                for(k=0;k<(1<<pp);k++)
                    if(now[k]>maxx)
                        now[k]=maxx;
                for(k=0;k<(1<<pp);k++)
                {
                    if(now[k]<=fuck)
                        now[k]=-1;
                    else
                        now[k]-=fuck;
                }
/*
                printf("fuck %d %d\n",i,j);
                for(k=0;k<(1<<pp);k++)
                {
                    printf("%d %d\n",k,now[k]);
                }
*/
            }
            if(flag==1)
                break;
        }
        flag=1;
        for(i=0;i<(1<<pp);i++)
            if(now[i]>0)
            {
                flag=0;
                break;
            }
        if(flag==1)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

Measured memory_bytes: 1280