/*
@Author
   Sujeet Kushwaha
*/
 
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
 
#define ll long long int
#define fast ios_base::sync_with_stdio(false)
#define fast_input cin.tie(NULL)
#define fast_output cout.tie(NULL)
#define vi vector<long long int> 
#define vp vector<pair<long long int ,long long int>>
#define pb push_back
#define mp make_pair
#define pp pop_back
#define iter vector<int>::iterator
#define pa pair<long long int ,long long int> 
#define f(a,b) for(int a=0;a<b;a++)
#define mod 1000000007
#define F first
#define S second
#define sett set<long long int>
#define um unordered_map<ll,ll>
#define ordered_set tree<pa, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
// ll mul(ll a,ll b)
// {
// 	return (a%mod*b%mod)%mod;
// }
// ll add(ll a,ll b)
// {
// 	ll res=a+b;
// 	if(res>=mod)
// 	{
//       res-=mod;
// 	}
// 	return res;
// }
// ll sub(ll a,ll b)
// {
// 	ll res=a-b;
// 	if(res<0)
// 	 res+=mod;
// 	return res;
// }
// ll powmod(ll a, ll b)
// {
//     ll res = 1;
//     while (b) {
//         if (b&1) {
//             res =mul(res,a);
//         }
//         b >>= 1;
//         a=mul(a,a);
//     }
 
//     return res;
// }
 
// ll modinv(ll a)
// {
//     return powmod(a, mod - 2);
// }
//  unordered_map<ll,ll>facti;
//  ll fact(ll n)
//  {
// 	if(n==0)return 1;
// 	if(n<=1)return 1;
// 	if(facti[n]!=0)return facti[n];
// 	return facti[n]=mul(n,fact(n-1));
//  }
//   ll ncr(ll n,ll r)
//   {
//         ll h=fact(n);
// 	ll v=fact(r);
// 	ll j=fact(n-r);
// 	v=mul(v,j);
// 	v=powmod(v,mod-2);
// 	return mul(h,v);
//  }
// int fastread(){
//     int x=0;
//     int c = getchar_unlocked();
//     while(c<48)
//         c = getchar_unlocked();
//     while(c>=48){
//         x = x*10 + (c - 48);
//         c = getchar_unlocked();
//     }
//     return x;
// }
// bool comp(pa a,pa b)
// {
//     if(a.F==b.F)
//     {
//         return v[a.S]<v[b.S];
//     }
//     returna.S<b.S;
// }

const int N = 2e5 + 10;
vector<pa>g[N];
ll dp[N];
void dfs(ll v,ll par=-1)
{
        for(pa d:g[v])
        {
                if(d.first-par)
                {
                      dp[d.first]=dp[v]^d.second;
                      dfs(d.first,v);
                }
        }
}
void solve()
{
    ll n;
    cin>>n;
    f(i,n-1)
    {
            ll x,y,w;
            cin>>x>>y>>w;
            x--,y--;
            g[x].pb({y,w});
            g[y].pb({x,w});
    }
    dfs(0);
    ll ans=0;
    f(j,60)
    {
            ll ones,zeros;
            ones=zeros=0;
            f(i,n)
            {
                    if(dp[i]&(1ll<<j))
                    {
                            ones++;
                    }
                    else
                    {
                            zeros++;
                    }
            }
            zeros*=ones;
            zeros%=mod;
            ans+=((1ll<<j)%mod*zeros%mod);
            ans%=mod;
    }
    cout<<ans<<endl;
}
int main() {
	fast;
	fast_input;
	fast_output;
	// ll t;
	// cin>>t;
	// while(t--)
	// {
	  solve();
	// }
	return 0;
}
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <climits>
#include <string>
#include <cmath>
#include <bitset>
#include <complex>
#include <functional>
#include <ctime>
#include <cassert>
#include <fstream>
#include <stack>
#include <random>
#include <iomanip>

#include <fstream>


using namespace std;
typedef long long ll;
typedef long double dd;
#define i_7 (ll)(1E9+7)
//#define i_7 998244353
#define i_5 i_7-2
ll mod(ll a){
    ll c=a%i_7;
    if(c>=0)return c;
    return c+i_7;
}
typedef pair<ll,ll> l_l;
ll inf=(ll)1E18;
#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define pb push_back
ll max(ll a,ll b){if(a<b)return b;else return a;}
ll min(ll a,ll b){if(a>b)return b;else return a;}
dd EPS=1E-9;
#define endl "\n"
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

struct Ni{
    ll w,v;
    ll flag;
};
bool comp(Ni x, Ni y){
    if(x.v>y.v){
        return true;
    }else if(x.v<y.v){
        return false;
    }
    return x.w<y.w;
}


int main(){fastio
    ll n,m,q;cin>>n>>m>>q;
    ll w[n+1],v[n+1];
    Ni ni[n+1];
    rep(i,1,n){
        cin>>w[i]>>v[i];
        ni[i].w=w[i];
        ni[i].v=v[i];
        ni[i].flag=i;
    }
    sort(ni+1,ni+(n+1),comp);
    ll x[m+1];
    rep(i,1,m){
        cin>>x[i];
    }
    rep(qi,1,q){
        ll l,r;cin>>l>>r;
        bool valid[m+1];rep(i,1,m)valid[i]=true;
        rep(i,l,r){
            valid[i]=false;
        }
        ll res=0;
        rep(i,1,n){
            ll now=0;
            rep(j,1,m){
                if(!valid[j])continue;
                if(x[j] < ni[i].w)continue;
                if(now!=0 && x[now] <= x[j])continue;
                now=j;
            }
            if(now==0)continue;
            res += ni[i].v;
            valid[now] = false;
        }
        cout<<res<<endl;
        
    }
    
    
    return 0;
    
}

