You are given a graph with $n$ nodes and $m$ directed edges. One lowercase letter is assigned to each node. We define a path's value as the number of the most frequently occurring letter. For example, if letters on a path are "abaca", then the value of that path is $3$. Your task is find a path whose value is the largest.
The first line contains two positive integers $n, m$ ($1 \leq n, m \leq 300\,000$), denoting that the graph has $n$ nodes and $m$ directed edges.

The second line contains a string $s$ with only lowercase English letters. The $i$-th character is the letter assigned to the $i$-th node.

Then $m$ lines follow. Each line contains two integers $x, y$ ($1 \leq x, y \leq n$), describing a directed edge from $x$ to $y$. Note that $x$ can be equal to $y$ and there can be multiple edges between $x$ and $y$. Also the graph can be not connected.
In the first sample, the path with largest value is $1 \to 3 \to 4 \to 5$. The value is $3$ because the letter 'a' appears $3$ times.
5 4
abaca
1 2
1 3
3 4
4 5
3
6 6
xzyabc
1 2
3 1
2 3
5 4
4 3
6 4
-1
10 14
xzyzyzyzqx
1 2
2 4
3 5
4 5
2 6
6 8
6 5
2 10
3 9
10 9
4 6
1 10
2 8
3 7
4
1 1
f
1 1
-1
10 50
ebibwbjihv
1 10
1 2
5 4
1 8
9 7
5 6
1 8
8 7
2 6
5 4
1 9
3 2
8 3
5 6
5 9
2 4
2 7
3 9
1 2
1 7
1 10
3 7
1 8
3 10
8 6
1 7
10 6
1 6
5 8
1 5
2 10
3 9
5 8
8 3
3 7
5 2
1 10
1 4
5 3
3 2
1 2
5 8
10 4
2 10
8 2
1 9
1 8
1 2
3 4
1 8
2
13 37
dwpzcppjmhkmz
2 6
3 6
6 7
6 7
6 7
6 7
6 8
6 8
6 8
6 8
4 6
4 6
5 6
4 6
4 6
6 9
6 9
6 10
6 10
6 10
6 10
4 6
1 6
1 6
10 11
6 11
1 6
6 12
6 12
6 12
6 13
6 13
6 13
6 13
3 6
2 6
2 6
3
5 8
tetqw
2 1
4 4
5 5
5 2
4 5
1 5
1 5
1 1
-1
5 8
reeet
4 3
2 5
4 2
2 4
4 2
5 2
3 3
3 4
-1
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include<queue>
#include<set>
using namespace std;
#define maxn 400000
int head[maxn],a[maxn],ans[maxn][30],cnt,in[maxn];int n,m;
struct Edge
{
    int to,next;
}edge[maxn];
void addedge(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
    in[v]++;
}
void init()
{
    memset(head,-1,sizeof(head));
    memset(in,0,sizeof(in));
    memset(ans,0,sizeof(ans));
    cnt=0;
}
char b[maxn];
int slove()
{
    int max1=-1,sum=n;
    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        if(!in[i]) {
            q.push(i);
            ans[i][a[i]]++;
        }
    }
    while(!q.empty())
    {
        int st=q.front();
        q.pop();
        sum--;
        for(int i=head[st];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            for(int j=1;j<=26;j++)
            {
                if(j==a[v])ans[v][j]=max(ans[v][j],ans[st][j]+1);
                else ans[v][j]=max(ans[v][j],ans[st][j]);
                max1=max(max1,ans[v][j]);
            }
            in[v]--;
            if(!in[v]) q.push(v);
        }
    }
    if(sum==0) return max1;
    else return -1;
}
int main()
{

    scanf("%d %d",&n,&m);
    scanf("%s",b+1);
    init();
    for(int i=1;b[i]!='\0';i++)
    {
        a[i]=b[i]-'a'+1;
    }
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        addedge(u,v);
    }
    printf("%d\n",slove());
}