#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 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*4+1); rep(i,m){ ll u, v, c; cin >> u >> v >> c; --u, --v; g[u].emplace_back(v,c); g[u+n].emplace_back(v+n,c); g[u+n*2].emplace_back(v+n*2,c); g[u+n*3].emplace_back(v+n*3,c); } string s; cin >> s; rep(i,n){ if(s[i] == 'K') g[i].emplace_back(i+n,0); else if(s[i] == 'C') g[i+n].emplace_back(i+n*2,0), g[i+n*3].emplace_back(n*4,0); else if(s[i] == 'P') g[i+n*2].emplace_back(i+n*3,0); } priority_queue,greater> q; vll dist(n*4+1, INF); q.emplace(0,0); while(!q.empty()){ auto [d,u] = q.top(); q.pop(); cout << flush; if(d >= dist[u]) continue; dist[u] = d; for(auto [v,c] : g[u]) q.emplace(d+c,v); } out(dist[n*4] > INF-10 ? -1 : dist[n*4] ); }