#include<cstdio>
#include<algorithm>
#define N 50010
#define M 500010
#define rg register
#define LL long long
using namespace std;
int n,m,cnt,root,tot,totnow,totbf;
int last[N],size[N],mxsize[N],dep[N],tmp[N],mg[N];
LL ans=;
bool v[N];
struct edge{
int to,pre,dis;
}e[M];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void getroot(int x,int fa){
size[x]=; mxsize[x]=;
for(rg int i=last[x],to;i;i=e[i].pre)if(!v[to=e[i].to]&&to!=fa){
getroot(to,x); size[x]+=size[to];
mxsize[x]=max(mxsize[x],size[to]);
}
mxsize[x]=max(mxsize[x],cnt-mxsize[x]);
if(!root||mxsize[x]<mxsize[root]) root=x;
}
void getdep(int x,int fa,int d){
dep[++totnow]=d;
for(rg int i=last[x],to;i;i=e[i].pre)
if(!v[to=e[i].to]&&to!=fa) getdep(to,x,d+e[i].dis);
}
void dfs(int x){
v[x]=; totbf=; tmp[]=;
for(rg int i=last[x],to;i;i=e[i].pre)if(!v[to=e[i].to]){
totnow=; getdep(to,x,e[i].dis); sort(dep+,dep++totnow);
int p=;
for(rg int j=totbf;j;j--){
while(p<=totnow&&tmp[j]+dep[p]<=m) p++;
ans+=p-;
}
p=; int p2=,totmg=;
while(p<=totnow&&p2<=totbf)
mg[++totmg]=dep[p]<tmp[p2]?dep[p++]:tmp[p2++];
while(p<=totnow) mg[++totmg]=dep[p++];
while(p2<=totbf) mg[++totmg]=tmp[p2++];
for(rg int j=;j<=totmg;j++) tmp[j]=mg[j];
totbf=totmg;
}
for(rg int i=last[x],to;i;i=e[i].pre)if(!v[to=e[i].to]){
root=; cnt=size[to];
getroot(to,x); dfs(root);
}
}
int main(){
n=read();
for(rg int i=;i<n;i++){
int u=read(),v=read(),w=read();
e[++tot]=(edge){v,last[u],w}; last[u]=tot;
e[++tot]=(edge){u,last[v],w}; last[v]=tot;
}
m=read();
cnt=n; getroot(,); dfs(root);
printf("%lld\n",ans);
}