/*  DuLL MCPC 2009 Problem C, by Gabriel Foust
*/

#include <iostream>
#include <fstream>
using namespace std;

ifstream fin;
int numDlls;
int numPrograms;
int numTransitions;
int dllSizes[20];
int dllReferences[20];
int programSizes[9];
string programDlls[9];

bool GetNextInputSet()
{
    numDlls= 0;
    fin >> numDlls;
    if (numDlls <= 0)
        return false;

    fin >> numPrograms >> numTransitions;

    for (int i= 0; i < numDlls; i++)
        fin >> dllSizes[i];

    for (int i= 0; i < numPrograms; i++)
    {
        fin >> programSizes[i];
        fin >> programDlls[i];
                for (int j = 0; j < programDlls[i].length(); j++) {//judge check
                    char ch = programDlls[i][j];
                    if (ch < 'A' || ch - 'A' >= numDlls)
                       cerr << "letter out of range" << endl;
                }
    }

    return true;
}

int AddReferences( int prog )
{
    string dlls= programDlls[prog - 1];

    int adjustment= 0;

    for (size_t i= 0; i < dlls.length(); i++)
    {
        int d= dlls[i] - 'A';
        if (dllReferences[d] == 0)
            adjustment+= dllSizes[d];
        dllReferences[d]++;
    }

    return adjustment;
}

int RemoveReferences( int prog )
{
    string dlls= programDlls[prog - 1];

    int adjustment= 0;

    for (size_t i= 0; i < dlls.length(); i++)
    {
        int d= dlls[i] - 'A';
        dllReferences[d]--;
        if (dllReferences[d] == 0)
            adjustment+= dllSizes[d];
    }

    return adjustment;
}

int MaxMemory()
{
    for (int d= 0; d < numDlls; d++)
        dllReferences[d]= 0;

    int memory= 0;
    int maxMemory= 0;

    for (int i= 0; i < numTransitions; i++)
    {
        int t;
        fin >> t;

        if (t > 0)
        {
            memory+= programSizes[t - 1];
            memory+= AddReferences( t );
        }
        else
        {
            memory-= programSizes[-t - 1];
            memory-= RemoveReferences( -t );
        }

        cerr << memory << endl;
        if (memory > maxMemory)
            maxMemory= memory;
    }

    return maxMemory;
}

int main()
{
    int count= 1;
    fin.open( "dull.in" );
    while (GetNextInputSet())
    {
        cerr << "Test #" << count++ << endl;
        cout << MaxMemory() << endl;
    }
    fin.close();

    return 0;
}