#include using namespace std; using ll = long long; const ll INF = 1LL << 60; #define all(a) begin(a), end(a) #define sz(a) ssize(a) template bool chmin(T& a, U b) { return a > b ? a = b, 1 : 0; } template bool chmax(T& a, U b) { return a < b ? a = b, 1 : 0; } using pll = pair; using ppll = tuple; using vpll = vector; using vll = vector; using vvll = vector; #define _O(_1, _2, _3, n, ...) n #define _r1(i, n) for(ll i = 0; i < (ll)(n); i++) #define _r2(i, l, r) for(ll i = (ll)(l); i < (ll)(r); i++) #define rep(...) _O(__VA_ARGS__, _r2, _r1)(__VA_ARGS__) #define _rr1(i, n) for(ll i = (ll)(n) - 1; i >= 0; i--) #define _rr2(i, l, r) for(ll i = (ll)(r) - 1; i >= (ll)(l); i--) #define rrep(...) _O(__VA_ARGS__, _rr2, _rr1)(__VA_ARGS__) template ostream& operator<<(ostream& o, const pair& p) { return o << "(" << p.first << "," << p.second << ")"; } template ostream& operator<<(ostream& o, const vector& v) { ll i = 0; for(auto& x : v) o << (i++ ? " " : "") << x; return o; } template void out(const H& h, const T&... t) { cout << h; ((cout << " " << t), ...); cout << endl; } int main(){ ll n,m; cin >> n >> m; vector> g(n); rep(i,m){ ll u, v, c; cin >> u >> v >> c; --u, --v; g[u].emplace_back(v,c); } string s; cin >> s; priority_queue,greater> q; vll dist(n, INF); q.emplace(0,0); while(!q.empty()){ auto [d,u] = q.top(); q.pop(); if(d >= dist[u]) continue; dist[u] = d; for(auto [v,c] : g[u]) q.emplace(d+c,v); } rep(i,n) if(s[i] == 'K') q.emplace(dist[i],i); fill(all(dist),INF); while(!q.empty()){ auto [d,u] = q.top(); q.pop(); if(d >= dist[u]) continue; dist[u] = d; for(auto [v,c] : g[u]) q.emplace(d+c,v); } priority_queue,greater> q2; vpll dist1(n,{INF,INF}); vpll dist2(n,{INF,INF}); rep(i,n) if(s[i] == 'C') q2.emplace(dist[i],i,i); while(!q2.empty()){ auto [d,u,x] = q2.top(); q2.pop(); if(d < dist1[u].first) dist1[u] = {d,x}; else if(d < dist2[u].first && x != dist1[u].second) dist2[u] = {d,x}; else continue; for(auto [v,c] : g[u]) q2.emplace(d+c,v,x); } rep(i,n) if(s[i] == 'P') { q2.emplace(dist1[i].first,i,dist1[i].second); q2.emplace(dist2[i].first,i,dist2[i].second); } fill(all(dist1),pll{INF,INF}); fill(all(dist2),pll{INF,INF}); while(!q2.empty()){ auto [d,u,x] = q2.top(); q2.pop(); if(d < dist1[u].first) dist1[u] = {d,x}; else if(d < dist2[u].first && x != dist1[u].second) dist2[u] = {d,x}; else continue; for(auto [v,c] : g[u]) q2.emplace(d+c,v,x); } ll ans = INF; rep(i,n) if(s[i] == 'C') { if(dist1[i].second == i) chmin(ans, dist2[i].first); else chmin(ans, dist1[i].first); } out(ans > INF-10 ? -1 : ans ); }