const DIVISOR: usize = 1_000_000_007; const NAME: &str = "PDCA"; fn main() { let mut nm = String::new(); std::io::stdin().read_line(&mut nm).ok(); let nm: Vec = nm.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nm[0]; let m = nm[1]; let mut s = String::new(); std::io::stdin().read_line(&mut s).ok(); let s: Vec = s.trim().chars().collect(); let mut dp: Vec> = vec![vec![0; n]; 4]; let mut path: Vec> = vec![vec![]; n]; for _ in 0..m { let mut uv = String::new(); std::io::stdin().read_line(&mut uv).ok(); let uv: Vec = uv.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let u = uv[0] - 1; let v = uv[1] - 1; path[u].push(v); path[v].push(u); } for i in 0..4 { let charactor: char = NAME.chars().nth(3-i).unwrap(); for j in 0..n { if i == 0 { dp[i][j] = if s[j] == charactor { 1 } else { 0 }; } else { if dp[i-1][j] > 0 { path[j].iter() .filter(|&node| s[*node] == charactor) .for_each(|&node| { dp[i][node] += dp[i-1][j]; }); } } } } println!("{}", dp[3].iter().map(|i| i % DIVISOR).sum::() % DIVISOR); }