#include #include #include using namespace std; int N; vector >G[2000]; string S,T; int ans; int dpS[2000][2001],dpT[2000][2001]; void dfs(int u,int p) { for(paire:G[u]) { int v=e.first; if(v==p)continue; dfs(v,u); for(int k=0;k<=S.size();k++) { ans=max(ans,dpS[u][S.size()-k]+dpT[v][k]); ans=max(ans,dpT[u][S.size()-k]+dpS[v][k]); if(T[k]==e.second) { ans=max(ans,dpS[u][S.size()-k-1]+dpT[v][k]+1); } if(S[k]==e.second) { ans=max(ans,dpT[u][S.size()-k-1]+dpS[v][k]+1); } } for(int k=0;k<=S.size();k++) { dpS[u][k]=max(dpS[u][k],dpS[v][k]); if(S[k]==e.second)dpS[u][k+1]=max(dpS[u][k+1],dpS[v][k]+1); dpT[u][k]=max(dpT[u][k],dpT[v][k]); if(T[k]==e.second)dpT[u][k+1]=max(dpT[u][k+1],dpT[v][k]+1); if(k>N>>S; T=S; reverse(T.begin(),T.end()); for(int i=1;i>a>>b>>c; a--,b--; G[a].push_back(make_pair(b,c)); G[b].push_back(make_pair(a,c)); } dfs(0,-1); cout<