#include<bits/stdc++.h>
using namespace std;
int n,h[100010],cnt;
long long ans,w[100010],MOD=1000000007,res;
struct node{
int v,nx;
}e[400010];
void add(int x,int y){
e[++cnt].v=y,e[cnt].nx=h[x],h[x]=cnt;
}
int dfs(int x){
long long zs=0;
for(int i=h[x];i;i=e[i].nx){
int y=e[i].v;
long long zz=dfs(y)%MOD;
ans=(ans+((zz*zs)%MOD*w[x]*2)%MOD+((zz*w[x])%MOD*w[x]*2)%MOD)%MOD;
zs=(zs+zz)%MOD;
}
ans=(ans+(w[x]*w[x])%MOD*w[x]%MOD)%MOD;
return (zs+w[x])%MOD;
}
int main(){
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
cin>>n;
cin>>w[1];
for(int i=2;i<=n;i++){
int x,y;
cin>>x>>y;
w[i]=y;
add(x,i);
}
res=dfs(1);
cout<<ans;
return 0;
}