#include<iostream>        //POJ 3211 Washing Clothes
#include<map>
#include<vector>
#include<string>
using namespace std;
int main()
{
int m,n,p,s[12],dp[200000],sum;        //因为不必记录路径,所以dp数组用一维的就行
int i,j,k;
string color;
while(cin>>m>>n&&m&&n)
{
map<string ,int> col;
map<string ,int>::iterator ite;
vector<int> vec[12];
for(i=0;i<m;++i)
{
cin>>color;
col.insert(make_pair(color,i));
}
memset(s,0,sizeof(s));
sum=0;
for(i=0;i<n;++i)
{
cin>>p>>color;
ite=col.find(color);
vec[ite->second].push_back(p);
s[ite->second]+=p;
}
for(i=0;i<m;++i)    //对每种颜色进行DP,容量c为s[i]/2,求出最接近c的值.
{
memset(dp,0,sizeof(dp));        //dp[x]=y表示容量为x,最多可容纳 y clothes
int c=s[i]/2;
for(j=0;j<vec[i].size();++j)
for(k=c;k>=vec[i][j];--k)    //注意k是从大到小,如果从小到大,那么因为dp[k-vec[i][j]]的值已经改变而发生错误
dp[k]=max(dp[k],dp[k-vec[i][j]]+vec[i][j]);
sum+=s[i]-dp[c];        //s[i]-dp[c] 作为这个颜色最少需要的时间
}
cout<<sum<<endl;
}
return 0;
}