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: Wrong Answer)

#include<cstdio>
#include<vector>
using namespace std;
char s[400001];
int ok,f[400001],viz[400001],poz[400001],ever_viz[400001];
vector<int>g[400001],v;
void dfs(int x)
{
    v.push_back(x);
    ever_viz[x]=1;
    if(!ok)
    {
        if(viz[x])
        {
            if(poz[x]==(int)v.size()-5)
            {
                int y=v[(int)v.size()-2];
                int z=v[(int)v.size()-3];
                int t=v[(int)v.size()-4];
                if(s[x-1]=='A')
                {
                    if(s[y-1]=='A'&&s[z-1]=='B'&&s[t-1]=='B')
                        ok=1;
                    if(s[y-1]=='B'&&s[z-1]=='B'&&s[t-1]=='A')
                        ok=1;
                }
                else
                {
                    if(s[y-1]=='B'&&s[z-1]=='A'&&s[t-1]=='A')
                        ok=1;
                    if(s[y-1]=='A'&&s[z-1]=='A'&&s[t-1]=='B')
                        ok=1;
                }
            }
        }
        else
        {
            poz[x]=v.size()-1;
            viz[x]=1;
            for(int i=0;i<(int)g[x].size();++i)
            {
                dfs(g[x][i]);
            }
            viz[x]=0;
        }
    }
    v.erase(v.begin()+v.size()-1);
}

int main()
{
    //freopen("f.in","r",stdin);
    //freopen("f.out","w",stdout);
    int n,m,i,x,y,nr,j;
    scanf("%d%d\n%s",&n,&m,s);
    nr=n;
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d",&x,&y);
        if(x==y)
            f[x]=1;
        else
        {
            g[x].push_back(y);
            g[y].push_back(x);
        }
    }
    for(i=1; i<=n; ++i)
    {
        if(f[i])
        {
            f[++nr]=1;
            s[nr-1]=s[i-1];
            g[i].push_back(nr);
            g[nr].push_back(i);
            for(j=0; j<(int)g[i].size(); ++j)
            {
                g[nr].push_back(g[i][j]);
                g[g[i][j]].push_back(nr);
            }
        }
    }
    for(i=1; i<=n&&!ok; ++i)
    {
        if(!ever_viz[i])
            dfs(i);
    }
    if(ok)
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}