/// Day Created: mar 31st 2026
#include <iostream>
#include <algorithm>
#include <vector>
#define fname ""
#define ll long long
// 548
using namespace std;
int n, m;
int p[300005];
string s[300005];
vector<int> edge[100005], heavy[100005];
ll dp[300005], g[300005];
struct node {
node *child[26];
ll res;
node() {
res=0;
for(int i=0; i<26; ++i) child[i]=NULL;
}
} *root=new node();
void update(string x, const ll &val) {
node *cur=root;
for(int i=0; i<x.size(); ++i) {
if(cur->child[x[i]-97]==NULL) cur->child[x[i]-97]=new node();
cur=cur->child[x[i]-97];
}
cur->res=max(cur->res, val);
}
ll get(string x) {
ll res=0;
node *cur=root;
for(int i=0; i<(int)x.size()-1; ++i) {
cur=cur->child[x[i]-97];
res=max(res, cur->res);
}
return res;
}
void solve() {
cin>>n>>m;
for(int i=1; i<=n; ++i) {
cin>>s[i]>>p[i];
}
for(int i=1; i<=m; ++i) {
int u, v;
cin>>u>>v;
edge[u].emplace_back(v), edge[v].emplace_back(u);
}
// find heavy/light node
for(int i=1; i<=100000; ++i)
if((int)edge[i].size()>548)
for(const auto &v:edge[i])
heavy[v].emplace_back(i);
// answer
fill(dp+1, dp+n+1, -1e18), fill(g+1, g+n+1, -1e18);
for(int i=n; i; --i) {
dp[i]=0;
// case 1
dp[i]=get(s[i])+p[i];
// case 2
for(const auto &v:heavy[p[i]]) dp[i]=max(dp[i], g[v]+p[i]);
if((int)edge[p[i]].size()<=548)
for(const auto &light:edge[i]) dp[i]=max(dp[i], g[light]+p[i]);
}
cout<<*max_element(dp+1, dp+n+1);
}
main() {
if(fopen(fname".inp", "r")) {
freopen(fname".inp", "r", stdin);
freopen(fname".out", "w", stdout);
}
cin.tie(0)->sync_with_stdio(0);
int tc=1;
// cin>>tc;
while(tc--) {
solve();
// cout<<'\n';
}
}
Ly8vIERheSBDcmVhdGVkOiBtYXIgMzFzdCAyMDI2CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNkZWZpbmUgZm5hbWUgIiIKI2RlZmluZSBsbCBsb25nIGxvbmcKLy8gNTQ4CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuLCBtOwppbnQgcFszMDAwMDVdOwpzdHJpbmcgc1szMDAwMDVdOwp2ZWN0b3I8aW50PiBlZGdlWzEwMDAwNV0sIGhlYXZ5WzEwMDAwNV07CmxsIGRwWzMwMDAwNV0sIGdbMzAwMDA1XTsKCnN0cnVjdCBub2RlIHsKCW5vZGUgKmNoaWxkWzI2XTsKCWxsIHJlczsKCW5vZGUoKSB7CgkJcmVzPTA7CgkJZm9yKGludCBpPTA7IGk8MjY7ICsraSkgY2hpbGRbaV09TlVMTDsKCX0KfSAqcm9vdD1uZXcgbm9kZSgpOwoKdm9pZCB1cGRhdGUoc3RyaW5nIHgsIGNvbnN0IGxsICZ2YWwpIHsKCW5vZGUgKmN1cj1yb290OwoJZm9yKGludCBpPTA7IGk8eC5zaXplKCk7ICsraSkgewoJCWlmKGN1ci0+Y2hpbGRbeFtpXS05N109PU5VTEwpIGN1ci0+Y2hpbGRbeFtpXS05N109bmV3IG5vZGUoKTsKCQljdXI9Y3VyLT5jaGlsZFt4W2ldLTk3XTsKCX0KCWN1ci0+cmVzPW1heChjdXItPnJlcywgdmFsKTsKfQoKbGwgZ2V0KHN0cmluZyB4KSB7CglsbCByZXM9MDsKCW5vZGUgKmN1cj1yb290OwoJZm9yKGludCBpPTA7IGk8KGludCl4LnNpemUoKS0xOyArK2kpIHsKCQljdXI9Y3VyLT5jaGlsZFt4W2ldLTk3XTsKCQlyZXM9bWF4KHJlcywgY3VyLT5yZXMpOwoJfQoJcmV0dXJuIHJlczsKfQoKdm9pZCBzb2x2ZSgpIHsKCWNpbj4+bj4+bTsKCWZvcihpbnQgaT0xOyBpPD1uOyArK2kpIHsKCQljaW4+PnNbaV0+PnBbaV07Cgl9Cglmb3IoaW50IGk9MTsgaTw9bTsgKytpKSB7CgkJaW50IHUsIHY7CgkJY2luPj51Pj52OwoJCWVkZ2VbdV0uZW1wbGFjZV9iYWNrKHYpLCBlZGdlW3ZdLmVtcGxhY2VfYmFjayh1KTsKCX0KCgkvLyBmaW5kIGhlYXZ5L2xpZ2h0IG5vZGUKCWZvcihpbnQgaT0xOyBpPD0xMDAwMDA7ICsraSkgCgkJaWYoKGludCllZGdlW2ldLnNpemUoKT41NDgpIAoJCQlmb3IoY29uc3QgYXV0byAmdjplZGdlW2ldKSAKCQkJCWhlYXZ5W3ZdLmVtcGxhY2VfYmFjayhpKTsKCgkvLyBhbnN3ZXIKCWZpbGwoZHArMSwgZHArbisxLCAtMWUxOCksIGZpbGwoZysxLCBnK24rMSwgLTFlMTgpOwoJZm9yKGludCBpPW47IGk7IC0taSkgewoJCWRwW2ldPTA7CgkJLy8gY2FzZSAxCgkJZHBbaV09Z2V0KHNbaV0pK3BbaV07CgkJLy8gY2FzZSAyCgkJZm9yKGNvbnN0IGF1dG8gJnY6aGVhdnlbcFtpXV0pIGRwW2ldPW1heChkcFtpXSwgZ1t2XStwW2ldKTsKCQlpZigoaW50KWVkZ2VbcFtpXV0uc2l6ZSgpPD01NDgpIAoJCQlmb3IoY29uc3QgYXV0byAmbGlnaHQ6ZWRnZVtpXSkgZHBbaV09bWF4KGRwW2ldLCBnW2xpZ2h0XStwW2ldKTsKCX0KCWNvdXQ8PCptYXhfZWxlbWVudChkcCsxLCBkcCtuKzEpOwp9CgptYWluKCkgewoJaWYoZm9wZW4oZm5hbWUiLmlucCIsICJyIikpIHsKCQlmcmVvcGVuKGZuYW1lIi5pbnAiLCAiciIsIHN0ZGluKTsKCQlmcmVvcGVuKGZuYW1lIi5vdXQiLCAidyIsIHN0ZG91dCk7Cgl9CgljaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CglpbnQgdGM9MTsKCS8vIGNpbj4+dGM7Cgl3aGlsZSh0Yy0tKSB7CgkJc29sdmUoKTsKCQkvLyBjb3V0PDwnXG4nOwoJfQp9