#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
#define ordered_set tree<pair<lng,lng>,null_type,less<pair<lng,lng>>,rb_tree_tag,tree_order_statistics_node_update>
#define ordered_multiset tree<double,null_type,less<double>,rb_tree_tag,tree_order_statistics_node_update>
#define rtr return 0
#define lng long long
#define double long double
#define endl "\n"
#define cmbntrcs for(int i=1;i<INF;i++){fact[i]=mul(i,fact[i-1]);}
//#pragma GCC optimize
const int MOD=1e9+7,INF=2e6+7,SZ=2e5+7,MSZ=1e5+3,MAXA=6e5+7;
int add(int x,int y){int z=x+y;if(z>=MOD){z-=MOD;}return z;}
int sub(int x,int y){int z=x-y;if(z<0){z+=MOD;}return z;}
int mul(int x,int y){return(x*1ll*y)%MOD;}
int pwr(int a,lng b)
{
if(!b){return 1;}
int res=pwr(a,b/2);res=mul(res,res);if(b%2){res=mul(res,a);}
return res;
}
int mod_inv(int a){return pwr(a,MOD-2);}
vector<int>fact(INF,1),inv(INF,1);
int nCr(int n,int r){return mul(fact[n],mul(inv[r],inv[n-r]));}
int nPr(int n,vector<int>r)
{
int den=1;
for(int i=0;i<r.size();i++){den=mul(den,fact[r[i]]);}
return mul(fact[n],mod_inv(den));
}
int sb(int s,int b){return nCr(s+b-1,s);}
int prfx(int i,int j){if(i<0||j<0){return 0;}return nCr(i+j,i);}
lng lcm(lng x,lng y){return(x*y/__gcd(x,y));}
lng trig(lng x){return x*(x+1)/2;}
lng sigma(lng x,lng y){return trig(y)-trig(x-1);}
lng fp(lng a,lng b)
{
if(!b){return 1;}
lng res=fp(a,b/2);res*=res;if(b%2){res*=a;}
return res;
}
string num_bin(lng n){if(n==0){return"0";}string x="";while(n){char c=(n%2)+'0';x+=c;n/=2;}reverse(x.begin(),x.end());return x;}
lng bin_num(string x){reverse(x.begin(),x.end());lng n=0;for(int i=0;i<x.size();i++){if(x[i]=='1'){n+=pow(2,i);}}return n;}
/**struct mtrx
{
lng nx,mx;vector<vector<lng>>bd;
void bld(vector<vector<lng>>obd){nx=obd.size(),mx=obd[0].size();bd=obd;}
void outm(){for(lng i=0;i<nx;i++){for(lng j=0;j<mx;j++){cout << bd[i][j] << ' ';}cout << endl;}}
};
mtrx idnt(lng n)
{
vector<vector<lng>>v;v.resize(n);
for(lng i=0;i<n;i++){v[i].assign(n,0);v[i][i]=1;}
return{n,n,v};
}
mtrx modn(mtrx a,lng x)
{
for(lng i=0;i<a.nx;i++){for(lng j=0;j<a.mx;j++){a.bd[i][j]%=x;}}
return a;
}
mtrx mulm(mtrx a,mtrx b)
{
if(a.mx!=b.nx){return{1,1,{{0}}};}
vector<vector<lng>>v;v.resize(a.nx);
for(lng i=0;i<a.nx;i++)
{
v[i].resize(b.mx);
for(lng j=0;j<b.mx;j++)
{
lng s=0;
for(lng x=0;x<a.mx;x++)
{
s+=a.bd[i][x]*b.bd[x][j];
s%=MOD;
}
v[i][j]=s;
}
}
mtrx ret;ret.bld(v);
//MOD FACTOR ret=modn(ret,MOD);
return ret;
}
mtrx fpm(mtrx a,lng b)
{
if(b==0){return idnt(a.nx);}
mtrx ret=fpm(a,b/2);ret=mulm(ret,ret);
if(b%2){ret=mulm(ret,a);}
return ret;
}**/
lng rnd_num()
{
srand(time(0));
lng x=0;for(lng i=0;i<60;i++){x+=(1ll<<i)*(rand()%2);}
return x;
}
lng rndm(lng a,lng b){return a+rnd_num()%((b+1)-a);}
pair<int,int>f1[SZ],f2[SZ];
int w1o[SZ],w2o[SZ],w1[SZ],w2[SZ],I1[SZ],I2[SZ];
vector<pair<int,int>>a1[SZ],a2[SZ];
vector<pair<int,int>>e1,e2;
pair<int,int>s1(int x)
{
if(f1[x]!=make_pair(-1,-1)){return f1[x];}
int z=1,o=0,nd=e1[x].first;
for(int i=0;i<a1[nd].size();i++)
{
if(a1[nd][i].first==e1[x].second){continue;}
int ps=a1[nd][i].second;
pair<int,int>r=s1(I1[ps]);
if(w1[ps]){o+=r.first;z+=r.second;}
else{z+=r.first;o+=r.second;}
}
return f1[x]={z,o};
}
pair<int,int>s2(int x)
{
if(f2[x]!=make_pair(-1,-1)){return f2[x];}
int z=1,o=0,nd=e2[x].first;
for(int i=0;i<a2[nd].size();i++)
{
if(a2[nd][i].first==e2[x].second){continue;}
int ps=a2[nd][i].second;
pair<int,int>r=s2(I2[ps]);
if(w2[ps]){o+=r.first;z+=r.second;}
else{z+=r.first;o+=r.second;}
}
return f2[x]={z,o};
}
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;cin >> n;
for(int i=0;i/2<n-1;i+=2)
{
int u,v,w;cin >> u >> v >> w;
a1[u].push_back({v,i});
a1[v].push_back({u,i+1});
w1o[i]=w;w1o[i+1]=w;
I1[i]=i+1;
I1[i+1]=i;
e1.push_back({u,v});
e1.push_back({v,u});
}
for(int i=0;i/2<n-1;i+=2)
{
int u,v,w;cin >> u >> v >> w;
a2[u].push_back({v,i});
a2[v].push_back({u,i+1});
w2o[i]=w;w2o[i+1]=w;
I2[i]=i+1;
I2[i+1]=i;
e2.push_back({u,v});
e2.push_back({v,u});
}
int ans=0;
for(int p=0;p<30;p++)
{
int pp=1<<p,c=0;
for(int i=0;i<e1.size();i++)
{
w1[i]=0;if((w1o[i]&pp)!=0){w1[i]=1;}
f1[i]={-1,-1};
}
for(int i=0;i<e2.size();i++)
{
w2[i]=0;if((w2o[i]&pp)!=0){w2[i]=1;}
f2[i]={-1,-1};
}
for(lng x=1;x<=n;x++)
{
pair<lng,lng>p1={0,0},p2={0,0},t;
t=s1(a1[x][0].second);
p1.first+=t.first;
p1.second+=t.second;
t=s1(I1[a1[x][0].second]);
if(w1[a1[x][0].second]){swap(t.first,t.second);}
p1.first+=t.first;
p1.second+=t.second;
t=s2(a2[x][0].second);
p2.first+=t.first;
p2.second+=t.second;
t=s2(I2[a2[x][0].second]);
if(w2[a2[x][0].second]){swap(t.first,t.second);}
p2.first+=t.first;
p2.second+=t.second;
c=add(c,add(mul(p1.first,p2.second),mul(p2.first,p1.second)));
}
ans=add(ans,mul(pp,c));
}
cout << ans;
return 0;
}
Copy