#include using namespace std; //高速化 struct ponjuice{ponjuice(){cin.tie(0);ios::sync_with_stdio(0);cout<using vc = vector; templateusing vvc = vc>; templateusing vvvc = vvc>; using vi = vc; using vvi = vvc; using vvvi = vvvc; using vl = vc; using vvl = vvc; using vvvl = vvvc; using pi = pair; using pl = pair; using ull = unsigned ll; templateusing priq = priority_queue; templateusing priqg = priority_queue, greater>; // for文 #define overload4(a, b, c, d, e, ...) e #define rep1(n) for(ll i = 0; i < n; i++) #define rep2(i, n) for(ll i = 0; i < n; i++) #define rep3(i, a, b) for(ll i = a; i < b; i++) #define rep4(i, a, b, step) for(ll i = a; i < b; i+= step) #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define per1(n) for(ll i = n-1; i >= 0; i--) #define per2(i, n) for(ll i = n-1; i >= 0; i--) #define per3(i, a, b) for(ll i = b-1; i >= a; i--) #define per4(i, a, b, step) for(ll i = b-1; i >= a; i-= step) #define per(...) overload4(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) //関数 #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define si(x) (ll)(x).size() templateinline bool chmax(S& a, T b){return a < b && ( a = b , true);} templateinline bool chmin(S& a, T b){return a > b && ( a = b , true);} inline void yes(){cout << "Yes\n";} inline void no(){cout << "No\n";} inline void yesno(bool y = true){if(y)yes();else no();} //定数 constexpr ll mod = 998244353; constexpr ll minf=-(1<<29); constexpr ll inf=(1<<29); constexpr ll MINF=-(1LL<<60); constexpr ll INF=(1LL<<60); const int dx[4] ={-1, 0, 1, 0}; const int dy[4] ={ 0, 1, 0,-1}; const int dx8[8] ={-1,-1,-1, 0, 1, 1, 1, 0}; const int dy8[8] ={-1, 0, 1, 1, 1, 0,-1,-1}; void solve(); int main() { int t = 1; // cin >>t; while(t--)solve(); } void solve(){ ll n,m; cin >> n >> m; vector>> g(n); rep(i,0,m) { ll u,v,c; cin >> u >> v >> c; u--,v--; g[u].push_back({v, c}); } string s; cin >> s; vector dist(n, vector(4, vector>(2, {INF, -1}))); using S = array; priority_queue,greater> q; q.push({0, 0, 0, 0}); dist[0][0][0] = {0, -1}; string st = "KCPC"; ll ans = INF; while(q.size()) { auto [cst, nw, p, c] = q.top(); q.pop(); if(dist[nw][p][c][0] != cst)continue; // cout << cst << " " << nw << " " << p << " " << c << endl; if(st[p] == s[nw]) { if(p == 3) { if(dist[nw][p][c][1] != nw) chmin(ans, cst); } else { if(p == 1) { if(dist[nw][p+1][0][1] == nw) { if(chmin(dist[nw][p+1][0], array{cst, nw})){ q.push({cst, nw, p+1, 0}); } } else if(dist[nw][p+1][1][1] == nw) { if(chmin(dist[nw][p+1][1], array{cst, nw})){ q.push({cst, nw, p+1, 1}); } } else if(dist[nw][p+1][0][0] < dist[nw][p+1][0][1]) { if(chmin(dist[nw][p+1][0], array{cst, nw})){ q.push({cst, nw, p+1, 0}); } }else { if(chmin(dist[nw][p+1][1], array{cst, nw})){ q.push({cst, nw, p+1, 1}); } } } else { if(dist[nw][p+1][0][1] == dist[nw][p][c][1]) { if(chmin(dist[nw][p+1][0], array{cst, dist[nw][p][c][1]})){ q.push({cst, nw, p+1, 0}); } } else if(dist[nw][p+1][1][1] == dist[nw][p][c][1]) { if(chmin(dist[nw][p+1][1], array{cst, dist[nw][p][c][1]})){ q.push({cst, nw, p+1, 1}); } } else if(dist[nw][p+1][0][0] < dist[nw][p+1][0][1]) { if(chmin(dist[nw][p+1][0], array{cst, dist[nw][p][c][1]})){ q.push({cst, nw, p+1, 0}); } }else { if(chmin(dist[nw][p+1][1], array{cst, dist[nw][p][c][1]})){ q.push({cst, nw, p+1, 1}); } } } } } for(auto [to, cost]: g[nw]) { if(dist[to][p][0][1] == dist[nw][p][c][1]) { if(chmin(dist[to][p][0], array{cst+cost, dist[nw][p][c][1]})){ q.push({cst+cost, to, p, 0}); } } else if(dist[to][p][1][1] == dist[nw][p][c][1]) { if(chmin(dist[to][p][1], array{cst+cost, dist[nw][p][c][1]})){ q.push({cst+cost, to, p, 1}); } } else if(dist[to][p][0][0] < dist[to][p][0][1]) { if(chmin(dist[to][p][0], array{cst+cost, dist[nw][p][c][1]})){ q.push({cst+cost, to, p, 0}); } }else { if(chmin(dist[to][p][1], array{cst+cost, dist[nw][p][c][1]})){ q.push({cst+cost, to, p, 1}); } } } } cout << (ans==INF?-1:ans) << endl; }