#include "testlib.h" #include using namespace std; using ll = long long; const int MIN_N = 4; const int MAX_N = 100'000; const int MAX_M = 150'000; const ll MAX_C = 1'000'000'000; const ll INF = 1LL << 60; using p2 = pair; template bool chmin(T& a, U b) { return a > b ? a = b, 1 : 0; } int main(int argc, char* argv[]) { registerValidation(argc, argv); int N = inf.readInt(MIN_N, MAX_N, "N"); inf.readSpace(); int M = inf.readInt(1, MAX_M, "M"); inf.readEoln(); vector>> G(N), rG(N); vector> uvs(M); for(int i = 0; i < M; i++) { int u = inf.readInt(1, N, "U_"+to_string(i)); inf.readSpace(); int v = inf.readInt(1, N, "V_"+to_string(i)); inf.readSpace(); ll c = inf.readLong(1, MAX_C, "C_"+to_string(i)); inf.readEoln(); inf.ensuref(u != v, "U_i not V_i"); u--; v--; G[u].emplace_back(v, c); rG[v].emplace_back(u, c); uvs[i] = {u, v}; } sort(uvs.begin(), uvs.end()); for(int i = 0; i < M - 1; i++) inf.ensuref(uvs[i] != uvs[i + 1], "(U_i, V_i) not (U_j, V_j)"); string S = inf.readString(format("[A-Z]{%d,%d}", N, N), "S"); inf.readEof(); vector d1(N, INF); { priority_queue, greater> pq; d1[0] = 0; pq.emplace(0, 0); while(!pq.empty()) { auto [d, n] = pq.top(); pq.pop(); if(d1[n] < d) continue; for(auto [e, c] : G[n]) { if(chmin(d1[e], d1[n] + c)) pq.emplace(d1[e], e); } } } vector dK(N, INF); { priority_queue, greater> pq; for(int i = 0; i < N; i++) if(S[i] == 'K') { dK[i] = d1[i]; pq.emplace(d1[i], i); } while(!pq.empty()) { auto [d, n] = pq.top(); pq.pop(); if(dK[n] < d) continue; for(auto [e, c] : G[n]) { if(chmin(dK[e], dK[n] + c)) pq.emplace(dK[e], e); } } } vector> dP1(N, {p2{INF, -1}, p2{INF, -1}}), dP2(N, {p2{INF, -1}, p2{INF, -1}}); { priority_queue, vector>, greater>> pq; for(int i = 0; i < N; i++) if(S[i] == 'C' && dK[i] < INF) { dP1[i].first = {dK[i], i}; pq.emplace(p2{dK[i], i}, i); } while(!pq.empty()) { auto [di, n] = pq.top(); pq.pop(); auto [d, i] = di; if(dP1[n].second.first < d) continue; for(auto [e, c] : G[n]) { if(dP1[e].first.first > d + c) { if(dP1[e].first.second != i) dP1[e].second = dP1[e].first; dP1[e].first = {d + c, i}; pq.emplace(p2{d + c, i}, e); } else if(dP1[e].second.first > d + c && dP1[e].first.second != i) { dP1[e].second = {d + c, i}; pq.emplace(p2{d + c, i}, e); } } } for(int i = 0; i < N; i++) if(S[i] == 'C') { dP2[i].first = {0, i}; pq.emplace(p2{0, i}, i); } while(!pq.empty()) { auto [di, n] = pq.top(); pq.pop(); auto [d, i] = di; if(dP2[n].second.first < d) continue; for(auto [e, c] : rG[n]) { if(dP2[e].first.first > d + c) { if(dP2[e].first.second != i) dP2[e].second = dP2[e].first; dP2[e].first = {d + c, i}; pq.emplace(p2{d + c, i}, e); } else if(dP2[e].second.first > d + c && dP2[e].first.second != i) { dP2[e].second = {d + c, i}; pq.emplace(p2{d + c, i}, e); } } } } ll ans = INF; for(int i = 0; i < N; i++) if(S[i] == 'P') { auto [pi1, pi2] = dP1[i]; auto [p1, i1] = pi1; auto [p2, i2] = pi2; auto [qj1, qj2] = dP2[i]; auto [q1, j1] = qj1; auto [q2, j2] = qj2; if(i1 != j1) chmin(ans, p1 + q1); if(i1 != j2) chmin(ans, p1 + q2); if(i2 != j1) chmin(ans, p2 + q1); if(i2 != j2) chmin(ans, p2 + q2); } if(ans == INF) cout << -1 << endl; else cout << ans << endl; }