use std::cmp::min; use std::io::Read; const INF: i64 = 1000000000; fn main() { let mut s: String = String::new(); std::io::stdin().read_to_string(&mut s).ok(); let mut itr = s.trim().split_whitespace(); let n: usize = itr.next().unwrap().parse().unwrap(); let s: Vec = (0..n) .map(|_| itr.next().unwrap().parse().unwrap()) .collect(); let m: usize = itr.next().unwrap().parse().unwrap(); let mut graph: Vec> = vec![vec![INF; n]; n]; for _ in 0..m { let a: usize = itr.next().unwrap().parse().unwrap(); let b: usize = itr.next().unwrap().parse().unwrap(); let c: i64 = itr.next().unwrap().parse().unwrap(); graph[a][b] = c; graph[b][a] = c; } for k in 0..n { for i in 0..n { for j in 0..n { graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]); } } } let mut ans: i64 = INF; // どの2地点に止まるか。 for i in 1..n - 1 { for j in 1..n - 1 { if i == j { continue; } ans = min( ans, graph[0][i] + graph[i][j] + graph[j][n - 1] + s[i] + s[j], ); } } println!("{}", ans); }