use std::{cmp::Reverse, collections::BinaryHeap}; use proconio::{ input, marker::{Chars, Usize1}, }; fn main() { input! { n: usize, m: usize, edges: [(Usize1, Usize1, usize); m], s: Chars, } let mut graph = vec![vec![]; n]; for &(u, v, w) in &edges { graph[u].push((v, w)); } let mut dist = vec![[!0usize; 4]; n]; let mut heap: BinaryHeap<(Reverse, usize, Vec)> = BinaryHeap::new(); dist[0][0] = 0; heap.push((Reverse(0), 0, vec![])); let kcpc = ['K', 'C', 'P', 'C']; while let Some((Reverse(d), current, history)) = heap.pop() { let i = history.len(); if d != dist[current][i] { continue; } let target = kcpc[history.len()]; if target == s[current] && !history.contains(¤t) { if i == 3 { println!("{}", dist[current][i]); return; } else if dist[current][i + 1] > dist[current][i] { let mut nhistory = history.clone(); nhistory.push(current); dist[current][i + 1] = dist[current][i]; heap.push((Reverse(d), current, nhistory)); } } for &(next, w) in &graph[current] { if dist[next][i] > dist[current][i] + w { dist[next][i] = dist[current][i] + w; heap.push((Reverse(dist[next][i]), next, history.clone())); } } } println!("-1"); }