RT(Wa 70)
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace clx
{
int l[2000001], n, m, z, root, cnt, first[500001];
vector<int> Map[500001];
struct ll {
int v, h;
void operator=(const ll a) {
v = a.v;
h = a.h;
}
bool operator<(const ll a) const { return h < a.h; }
} st[2000001][28], a[2000001];
void ST() {
int o1 = log2(4 * n), o2 = log2(2 * n);
for (int i = 1; i <= 4 * n; i++)
for (int j = 1; j <= o1; j++) st[i][j] = { 0, INT_MAX };
for (int i = 1; i <= 2 * n; i++) st[i][0] = a[i];
for (int j = 1; j <= o2; j++) {
for (int i = 1; i <= 2 * n; i++) {
st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}
for (int i = 2; i <= 2 * n; i++) {
l[i] = l[i / 2] + 1;
}
}
int q(int u, int v) {
if (u > v)
swap(u, v);
int o = l[v - u + 1];
return min(st[u][o], st[v - (1 << o) + 1][o]).v;
}
void A(int u, int f, int h) {
a[++cnt] = { u, h };
first[u] = cnt;
for (auto i : Map[u]) {
if (i != f) {
A(i, u, h + 1);
a[++cnt] = { u, h };
}
}
}
int lca(int u,int v)
{
return q(first[u],first[v]);
}
}
int m,n,t[1000001][26],s[1000001],root[100001],v[1000001],cnt;
vector<pair<int,string>>Map[100001];
void dfs(int u,int f)
{
for(auto k:Map[u])
{
if(k.first==f)continue;
root[k.first]=++cnt;
int now=root[u];
for(int j=0;j<26;j++)t[cnt][j]=t[now][j];
now=cnt;
for(int i=0;i<k.second.size();i++)
{
cnt++;
for(int j=0;j<26;j++)t[cnt][j]=t[t[now][k.second[i]-'a']][j];
t[now][k.second[i]-'a']=cnt;
now=cnt;
}
s[now]++;
dfs(k.first,u);
}
}
int query(int u,string s1)
{
int now=root[u];
for(int i=0;i<s1.size();i++)now=t[now][s1[i]-'a'];
return s[now];
}
void dfstrie(int u)
{
v[u]=1;
for(int i=0;i<26;i++)
{
if(!v[t[u][i]])dfstrie(t[u][i]);
s[u]+=s[t[u][i]];
}
}
signed main()
{
cin>>n;
clx::n=n;
for(int i=1;i<n;i++)
{
int u,v;
string s;
cin>>u>>v>>s;
Map[u].push_back({v,s});
Map[v].push_back({u,s});
clx::Map[u].push_back(v);
clx::Map[v].push_back(u);
}
clx::A(1,0,0);
clx::ST();
root[1]=++cnt;
dfs(1,0);
for(int i=1;i<=n;i++)dfstrie(root[i]);
//for(int i=1;i<=cnt;i++)cout<<s[i]<<'\n';
cin>>m;
for(int i=1;i<=m;i++)
{
int u,v;
string s;
cin>>u>>v>>s;
cout<<query(u,s)+query(v,s)-2*query(clx::lca(u,v),s)<<"\n";
}
}