#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <map>
#include <string>
#include <vector>

using ll=int64_t;

ll n{},m{};
std::string s;
std::vector<std::vector<ll>> edge;

ll find(ll now,std::map<char, ll> &w,ll max,std::vector<bool> &vis){
    if(vis[now]){
        return -1;
    }
    vis[now]=true;
    w[s[now]]++;
    max=std::max(max,w[s[now]]);
    for(ll nxt:edge[now]){
        if(ll findr = find(nxt, w,max,vis);findr==-1){
            return -1;
        }else{
            max=std::max(max,findr);
        }
    }
    w[s[now]]--;
    vis[now]=false;
    return max;
}

int main(){
    std::iostream::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    std::cin>>n>>m;
    edge.resize(n+1);
    std::cin>>s;
    s=' '+s;
    for(ll i=1;i<=m;i++){
        ll u{},v{};
        std::cin>>u>>v;
        edge[u].push_back(v);
    }

    for(ll i=1;i<=n;i++){
        ll ans{};
        std::map<char, ll> w;
        std::vector<bool> vis(n+1);
        ans=find(i, w, 0,vis);
        std::cout<<ans<<'\n';
    }
}