Problem:
Score : 900 points

Problem Statement

You are given an undirected graph consisting of N vertices and M edges.
The vertices are numbered 1 to N, and the edges are numbered 1 to M.
In addition, each vertex has a label, A or B. The label of Vertex i is s_i.
Edge i bidirectionally connects vertex a_i and b_i.

The phantom thief Nusook likes to choose some vertex as the startpoint and traverse an edge zero or more times.
Today, he will make a string after traveling as above, by placing the labels of the visited vertices in the order visited, beginning from the startpoint.

For example, in a graph where Vertex 1 has the label A and Vertex 2 has the label B, if Nusook travels along the path 1 \rightarrow 2 \rightarrow 1 \rightarrow 2 \rightarrow 2, the resulting string is ABABB.

Determine if Nusook can make all strings consisting of A and B.

Constraints

2 \leq N \leq 2 \times 10^{5}

1 \leq M \leq 2 \times 10^{5}

|s| = N

s_i is A or B.

1 \leq a_i, b_i \leq N

The given graph may NOT be simple or connected.

Input

Input is given from Standard Input in the following format:

N M
s
a_1 b_1
:
a_{M} b_{M}

Output

If Nusook can make all strings consisting of A and B, print Yes; otherwise, print No.

Sample Input 1

2 3
AB
1 1
1 2
2 2

Sample Output 1

Yes

Since Nusook can visit Vertex 1 and Vertex 2 in any way he likes, he can make all strings consisting of A and B.

Sample Input 2

4 3
ABAB
1 2
2 3
3 1

Sample Output 2

No

For example, Nusook cannot make BB.

The given graph may not be connected.

Sample Input 3

13 23
ABAAAABBBBAAB
7 1
10 6
1 11
2 10
2 8
2 11
11 12
8 3
7 12
11 2
13 13
11 9
4 1
9 7
9 6
8 13
8 6
4 10
8 7
4 3
2 1
8 12
6 9

Sample Output 3

Yes

Sample Input 4

13 17
BBABBBAABABBA
7 1
7 9
11 12
3 9
11 9
2 1
11 5
12 11
10 8
1 11
1 8
7 7
9 10
8 8
8 12
6 2
13 11

Sample Output 4

No

Solution in C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;


public class Edge{
	public int X{ get; set; }
	public int Y{ get; set; }
	public Edge(int x, int y){
		X = x;
		Y = y;
	}
}


public class C{
	
	public static void Main(){
	
		string[] args;
		
		args = Console.ReadLine().Split(' ');
		int n = Int32.Parse(args[0]);
		int m = Int32.Parse(args[1]);
		
		string s = Console.ReadLine();
		
		List<Edge> AA = new List<Edge>();
		List<Edge> BB = new List<Edge>();
		List<Edge> AB = new List<Edge>();
		for( int i = 0; i < m; i++ ){
			args = Console.ReadLine().Split(' ');
			int x = Int32.Parse(args[0]);
			int y = Int32.Parse(args[1]);
			if( s[x-1] == 'A' ){
				if( s[y-1] == 'A' ){
					AA.Add( new Edge(x,y) );
					AA.Add( new Edge(y,x) );					
				}else{
					AB.Add( new Edge(x,y) );
				}
				
			}else{
				if( s[y-1] == 'A' ){
					AB.Add( new Edge(y,x) );					
				}else{
					BB.Add( new Edge(x,y) );
					BB.Add( new Edge(y,x) );					
				}				
			}
		}
		
		bool result = false;
		var distinctAA = AA.Distinct();
		var distinctBB = BB.Distinct();
		foreach( Edge aa in distinctAA ){
			foreach( Edge bb in distinctBB ){
				
				int a1 = aa.X;
				int a2 = aa.Y;
				int b1 = bb.X;
				int b2 = bb.Y;
				
				if( AB.Exists( ab => ((ab.X == a1) && (ab.Y == b1)) )
					&& AB.Exists( ab => ((ab.X == a2) && (ab.Y == b2)) ) )
				{
					result = true;
					break;
				}
				
				if( AB.Exists( ab => ((ab.X == a1) && (ab.Y == b2)) )
					&& AB.Exists( ab => ((ab.X == a2) && (ab.Y == b1)) ) )
				{
					result = true;
					break;
				}
				
			}			
		}
		
		Console.WriteLine( result ? "Yes" : "No" );
		
	}

}