#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(0);
  int k, n;
  cin >> k >> n;
  map<string, multiset<int, greater<int>>> m;
  string s;
  int a;
  for (int i = 0; i < k; i++) {
    cin >> s >> a;
    m[s].insert(a);
  }
  int ans = 0, maxq = 0;
  for (auto q : m) {
    string tt = q.first, ss = tt;
    reverse(tt.begin(), tt.end());
    if (ss != tt) {
      if (!m.count(tt)) continue;
      while (!m[ss].empty() && !m[tt].empty()) {
        int w = *m[ss].begin() + *m[tt].begin();
        if (w <= 0) break;
        ans += w;
        m[ss].erase(m[ss].begin());
        m[tt].erase(m[tt].begin());
      }
    } else {
      while (m[ss].size() > 1) {
        int w = *m[ss].begin();
        m[ss].erase(m[ss].begin());
        if (w + *m[ss].begin() <= 0) {
          m[ss].insert(w);
          break;
        }
        maxq = max(maxq, -*m[ss].begin());
        int ww = *m[ss].begin();
        ans += w + ww;
        m[ss].erase(m[ss].begin());
      }
    }
  }
  int maxa = -1e9;
  for (auto q : m) {
    string tt = q.first, ss = tt;
    reverse(tt.begin(), tt.end());
    if (tt != ss) continue;
    maxa = max(maxa, *m[ss].begin());
  }
  ans += max(0, max(maxa, maxq));
  cout << ans;
}
