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++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3f
#define EPS (1e-10)
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
class UnionFind {
	vector<int>par, sz;
public:
	UnionFind() {}
	UnionFind(int n) {
		par = sz = vector<int>(n);
		for (int i = 0; i < n; i++) {
			par[i] = i;
			sz[i] = 1;
		}
	}
	int find(int x) {
		if (par[x] == x)return x;
		return par[x] = find(par[x]);
	}
	void unite(int x, int y) {
		x = find(x); y = find(y);
		if (x == y)return;
		if (sz[x] > sz[y]) {
			par[y] = x;
			sz[x] += sz[y];
		}
		else {
			par[x] = y;
			sz[y] += sz[x];
		}
	}
	bool same(int x, int y) {
		return find(x) == find(y);
	}
	int size(int x) {
		return sz[find(x)];
	}
};

vector<int>E[300000];
int a[300000],b[300000];
signed main(){
	int n,m;string s;cin>>n>>m>>s;
	rep(i,m){
		scanf("%d%d",&a[i],&b[i]);a[i]--;b[i]--;
		E[a[i]].push_back(b[i]);
		E[b[i]].push_back(a[i]);
	}
	vector<int>a,b;
	rep(i,n){
		if(s[i]=='A')a.push_back(i);
		else b.push_back(i);
	}

	while(1){
		vector<int>A,B;
		for(int i:a){
			bool flag=false;
			for(int u:E[i]){
				if(s[i]==s[u]){
					if(binary_search(a.begin(),a.end(),u))flag=true;
				}
			}
			if(flag){
				A.push_back(i);
			}
		}
		for(int i:b){
			bool flag=false;
			for(int u:E[i]){
				if(s[i]==s[u]){
					if(binary_search(b.begin(),b.end(),u))flag=true;
				}
			}
			if(flag){
				B.push_back(i);
			}
		}
		vector<int>ansA,ansB;
		for(int i:A){
			bool flag=false;
			for(int u:E[i]){
				if(s[i]!=s[u]){
					if(binary_search(B.begin(),B.end(),u)){flag=true;break;}
				}
			}
			if(flag)ansA.push_back(i);
		}
		for(int i:B){
			bool flag=false;
			for(int u:E[i]){
				if(s[i]!=s[u]){
					if(binary_search(A.begin(),A.end(),u)){flag=true;break;}
				}
			}
			if(flag)ansB.push_back(i);
		}
		if(a.size()==ansA.size()&&b.size()==ansB.size())break;
		a=ansA;b=ansB;
	}
	if(a.size()&&b.size()){
		puts("Yes");
	}
	else{
		puts("No");
	}
}