#include <bits/stdc++.h>
using namespace std;
long long f[100001];
struct node {
  long long a, b, c, d;
  node(){};
  node(long long aa, long long bb, long long cc, long long dd) {
    a = aa, b = bb, c = cc, d = dd;
  }
};
struct cmp {
  bool operator()(const node& x, const node& y) const {
    if (x.a != y.a) return x.a < y.a;
    if (x.b != y.b) return x.b < y.b;
    if (x.c != y.c) return x.c > y.c;
    return x.d < y.d;
  }
};
long long ptr = -1;
int main() {
  string ss;
  long long k, n, x, y, i, z, ans = 0, sofar;
  set<node, cmp> s;
  f[0] = 1;
  for (i = 1; i <= 100000; i++) f[i] = (f[i - 1] * 31LL) % 786433;
  scanf("%lld%lld", &k, &n);
  while (k--) {
    cin >> ss;
    x = 0, y = 0;
    for (i = 0; i < (int)ss.length(); i++) {
      x = (x + (ss[i] - 'a') * f[i]) % 786433;
      y = (y + (ss[i] - 'a') * f[n - 1 - i]) % 786433;
    }
    scanf("%lld", &z);
    s.insert(node(x, y, z, ++ptr));
  }
  sofar = 0;
  while (1) {
    if (s.empty()) break;
    auto it = s.begin();
    node e = *it;
    s.erase(it);
    auto jt = s.lower_bound(node(e.b, e.a, 10000000, -1));
    if (jt == s.end()) {
      if (e.a == e.b) sofar = ((sofar > e.c) ? sofar : e.c);
      continue;
    }
    if (e.b == jt->a and e.a == jt->b and (e.c + jt->c) > 0) {
      ans += (e.c + jt->c);
      if (e.a == e.b) sofar = ((sofar > -jt->c) ? sofar : -jt->c);
      s.erase(jt);
    } else if (e.a == e.b)
      sofar = ((sofar > e.c) ? sofar : e.c);
  }
  ans += sofar;
  printf("%lld\n", ans);
}
