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 (Clang 3.8.0) (judge verdict: Accepted)

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#define vv(a, b, c, d) vector<vector<d> >(a, vector<d>(b, c))
#define vvi std::vector<std::vector<int> >
#define vvl std::vector<std::vector<ll> >
#define MODs 1000000007;
typedef long long int ll;
using namespace std;

vvi G = vv(200001, 0, 0, int);
vvi p = vv(200001, 2, 0, int);
std::vector<int> c(200001);

int main(int argc, char const *argv[]) {
  int N, M, a, b;
  std::cin >> N >> M;
  string S;
  std::cin >> S;
  for(int i=0;i<N;i++) c[i+1] = (S[i]=='A'?1:0);
  for(int i=0;i<M;i++){
    std::cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
    (c[b]==1?p[a][0]:p[a][1]) += 1;
    (c[a]==1?p[b][0]:p[b][1]) += 1;
  }
  //for(int i=1;i<=N;i++) std::cout << i << " " <<p[i][0] << " " << p[i][1] << '\n';
  deque<int> q;
  for(int i=1;i<=N;i++) if(p[i][0]==0||p[i][1]==0) q.push_back(i);
  set<int> num;
  for(int i=1;i<=N;i++) num.insert(i);

  while(!q.empty()){
    int x = q.front();
    q.pop_front();
    if(num.find(x)==num.end()) continue;
    num.erase(x);
    //std::cout << x << '\n';
    for(int i=0;i<G[x].size();i++){
      if(num.find(G[x][i])==num.end()) continue;
      (c[x]==1?p[G[x][i]][0]:p[G[x][i]][1])-=1;
      if(p[G[x][i]][0]==0||p[G[x][i]][1]==0) q.push_back(G[x][i]);
    }
    p[x][0] = p[x][1] = 0;
  }
  //for(int i=1;i<=N;i++) std::cout << i << " " << p[i][0] << " " << p[i][1] << '\n';
  //for(auto itr = num.begin(); itr!=num.end();itr++) std::cout << *itr << " ";
  std::cout << (num.empty()?"No":"Yes") << '\n';
  return 0;
}