#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N=100005,mod=(1e9)+7;
int dp[2][2][32][N],idx,bit;
vector<vector<pair<int,int>>>adj[2];
void dfs_down(int v,int p,int *dp1,int *dp2){//dp1 dp[idx][0][bit][v]
dp[idx][0][bit][v]=1;
for(auto&[u,w]:adj[idx][v]){
if(u==p)continue;
dfs_down(u,v,dp1,dp2);
int cur=(w>>bit)&1;
dp1[v]+=(cur?dp2[u]:dp1[v]);
dp2[v]+=(cur?dp1[u]:dp2[u]);
}
}
void dfs_up(int v,int p,int pw){
dp[idx][0][bit][v]=dp[idx][pw][bit][p];
dp[idx][1][bit][v]=dp[idx][pw^1][bit][p];
for(auto&[u,w]:adj[idx][v]){
if(u==p)continue;
dfs_up(u,v,(w>>bit)&1);
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
adj[0].resize(n);
adj[1].resize(n);
for(int k=0;k<2;k++)for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
u--;v--;
adj[k][u].push_back({v,w});
adj[k][v].push_back({u,w});
}
for(idx=0;idx<2;idx++)for(bit=0;bit<30;bit++){
dfs_down(0,0,dp[idx][0][bit],dp[idx][1][bit]);
dfs_up(0,0,0);
}
long long res=0;
for(bit=0;bit<30;bit++)for(int i=0;i<n;i++){
long long cnt=dp[0][0][bit][i]*1LL*dp[1][1][bit][i];
cnt+=dp[0][1][bit][i]*1LL*dp[1][0][bit][i];
cnt%=mod;
res+=((1<<bit)*cnt)%mod;
}
cout<<(res%mod);
return 0;
}
Copy