#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>
using namespace std;
const int maxn=200005,maxn1=1000005;
int first[maxn],last[maxn],next[maxn],f[maxn1][26],g[maxn][20],ans;
int n,m,i,t,j,k,l,x,y,d[maxn],num,v[maxn],len,z,c[maxn1],deep[maxn];
char s[maxn][20],s1[20];
bool bz[maxn];
void lian(intx,inty){
last[++num]=y;next[num]=first[x];first[x]=num;
}
void insert(int j,int v1,int &v){
v=++num;c[v]=c[v1];int t,k;
for (k=0;k<=25;k++)
f[v][k]=f[v1][k];
if (j==len+1){
c[v]++;return;
}
insert(j+1,f[v1][s[l][j]-97],f[v][s[l][j]-97]);
c[v]++;
}
int lca(intx,inty){
int i,j,t,k,l;
if (deep[x]<deep[y]) swap(x,y);
for (i=log(n)/log(2);i>=0;i--)
if (deep[g[x][i]]>=deep[y]) x=g[x][i];
if (x==y) returnx;
for (i=log(n)/log(2);i>=0;i--)
if (g[x][i]!=g[y][i]) x=g[x][i],y=g[y][i];
return g[x][0];
}
int find(int i,int v){
if (!v) return0;
if (i==l+1) return c[v];
return find(i+1,f[v][s1[i]-97]);
}
int main(){
freopen("strings.in","r",stdin);freopen("strings.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n-1;i++)
scanf("%d%d%s\n",&x,&y,s[i]+1),lian(x,y),lian(y,x);
v[1]=j=1;i=0;bz[1]=true;deep[1]=1;
num=0;
while (i<j){
x=v[++i];
for (t=first[x];t;t=next[t]){
if (bz[last[t]]) continue;
bz[last[t]]=true;g[last[t]][0]=x;v[++j]=last[t];
l=t/2;if (t%2)l++;len=strlen(s[l]+1);deep[v[j]]=deep[x]+1;
insert(1,d[x],d[last[t]]);
}
}
for (j=1;j<=log(n)/log(2);j++)
for (i=1;i<=n;i++)
g[i][j]=g[g[i][j-1]][j-1];
scanf("%d",&m);
for (i=1;i<=m;i++){
scanf("%d%d%s",&x,&y,s1+1);
t=lca(x,y);l=strlen(s1+1);
ans=find(1,d[x])+find(1,d[y])-find(1,d[t])*2;
printf("%d\n",ans);
}
}