#include <iostream>
#include <map>
using namespace std;
map<char, int> hashMap;
int dp[2023][2023];
char num[2023];
int N, M;
void input()
{
char c;
int x = 0, y = 0;
scanf("%d %d\n", &N, &M);
for (int i = 1; i <= M; i++)
{
scanf("%c", &num[i]);
}
for (int i = 1; i <= N; i++)
{
scanf("\n%c %d %d", &c, &x, &y);
hashMap[c] = min(x, y);
}
}
int solve(int k, int i)
{
int minVal = 0x3f3f3f3f;
if (k == 1)
{
// 这里时个坑,注意要做判断
if (num[i] != num[i + k])
{
minVal = min(hashMap[num[i]], hashMap[num[i + k]]);
return minVal;
}
else
{
return 0;
}
}
if (num[i] == num[i + k])
{
minVal = min(minVal, dp[i + 1][i + k - 1]);
}
minVal = min(minVal, dp[i][i + k - 1] + hashMap[num[i + k]]);
minVal = min(minVal, dp[i + 1][i + k] + hashMap[num[i]]);
return minVal;
}
void doDp()
{
for (int k = 1; k <= M; k++)
{
for (int i = 1; i + k <= M; i++)
{
dp[i][i + k] = solve(k, i);
}
}
}
int main()
{
input();
doDp();
printf("%d\n", dp[1][M]);
return 0;
}