#include using namespace std; int dp[2005][2005]; vectortmp[30]; vector>ki[2005]; void dfs(int n,int p) { char c; for(int i = 0; i < ki[n].size(); i++) { if(ki[n][i].first == p) { c = ki[n][i].second; continue; } dfs(ki[n][i].first,n); } if(p == -1) { return; } for(int i = 0; i <= 2000; i++) { dp[p][i] = max(dp[p][i],dp[n][i]); int it = lower_bound(tmp[c-'a'].begin(),tmp[c-'a'].end(),i)-tmp[c-'a'].begin(); if(it != tmp[c-'a'].size()) { dp[p][tmp[c-'a'][it]+1] = max(dp[p][tmp[c-'a'][it]+1],dp[n][i]+1); } } } void dfs2(int n,int p) { vector>mx(ki[n].size(),vector(2005)); for(int i = 0; i < ki[n].size(); i++) { for(int j = 0; j <= 2000; j++) { mx[i][j] = max(mx[i][j],dp[ki[n][i].first][j]); char c = ki[n][i].second; int it = lower_bound(tmp[c-'a'].begin(),tmp[c-'a'].end(),j)-tmp[c-'a'].begin(); if(it != tmp[c-'a'].size()) { mx[i][tmp[c-'a'][it]+1] = max(mx[i][tmp[c-'a'][it]+1],dp[ki[n][i].first][j]+1); } } } vector>l(ki[n].size(),vector(2005)),r(ki[n].size(),vector(2005)); for(int i = 0; i < ki[n].size(); i++) { for(int j = 0; j <= 2000; j++) { l[i][j] = mx[i][j]; r[i][j] = mx[i][j]; } } for(int i = 0; i < ki[n].size()-1; i++) { for(int j = 0; j <= 2000; j++) { l[i+1][j] = max(l[i+1][j],l[i][j]); } } for(int i = ki[n].size()-1; i >= 1; i--) { for(int j = 0; j <= 2000; j++) { r[i-1][j] = max(r[i-1][j],r[i][j]); } } for(int i = 0; i < ki[n].size(); i++) { if(ki[n][i].first == p) { continue; } for(int j = 0; j <= 2000; j++) { int cnt = 0; if(i) { cnt = max(cnt,l[i-1][j]); } if(i+1 < ki[n].size()) { cnt = max(cnt,r[i+1][j]); } dp[n][j] = cnt; } dfs2(ki[n][i].first,n); } for(int i = 0; i <= 2000; i++) { dp[n][i] = l[ki[n].size()-1][i]; } } int main() { int N; string S; cin >> N >> S; for(int i = 0; i < N-1; i++) { int u,v; char c; cin >> u >> v >> c; u--; v--; ki[u].push_back({v,c}); ki[v].push_back({u,c}); } for(int i = 0; i < S.size(); i++) { tmp[S[i]-'a'].push_back(i); } dfs(0,-1); int ans = 0; for(int i = 0; i < N; i++) { for(int j = 0; j <= S.size(); j++) { ans = max(ans,dp[i][j]); } } dfs2(0,-1); for(int i = 0; i < N; i++) { for(int j = 0; j <= S.size(); j++) { ans = max(ans,dp[i][j]); } } cout << ans << endl; }