import java.util.*; import java.io.*; public class Main { public static Scanner sc = new Scanner(System.in); public static PrintWriter pw = new PrintWriter(System.out); public static void main(String[] args) { int t = 1; while( t > 0 ) { solve(); t--; } pw.flush(); } static void solve() { int N = sc.nextInt(); int[] a = new int[N-1]; int[] b = new int[N-1]; int[] c = new int[N-1]; long ans = 0; long P = 1000000007; for( int i = 0; i < N-1; i++ ) { a[i] = sc.nextInt()-1; b[i] = sc.nextInt()-1; c[i] = sc.nextInt(); } for( int i = 0; i < 30; i++ ) { long k = modpow(2,i,P); ans += bfs(N,a,b,c,i,k,P); ans %= P; } pw.println(ans); } static long bfs(int N, int[] a, int[] b, int[] c, int d, long k, long P) { long res = 0; TreeSet todo = new TreeSet<>(); ArrayList> edge = new ArrayList<>(); for( int i = 0; i < N; i++ ) { todo.add(i); edge.add(new ArrayList<>()); } for( int i = 0; i < N-1; i++ ) { if( (c[i]>>d)%2 == 1 ) { edge.get(a[i]).add(b[i]); edge.get(b[i]).add(a[i]); } } LinkedList queue = new LinkedList<>(); boolean[] visited = new boolean[N]; while( !todo.isEmpty() ) { int j = todo.pollFirst(); queue.offer(j); long cnt = 0; while( !queue.isEmpty() ) { int now = queue.poll(); if( visited[now] ) continue; visited[now] = true; todo.remove(now); cnt++; for( int next : edge.get(now) ) { if( !visited[next] ) queue.offer(next); } } res += cnt*(cnt-1)/2%P*k%P; res %= P; } return res; } static long modpow( long x, long n, long mod ) { if( n == 0 ) { return 1; } long k = 1; while( n > 1 ) { if( n%2 == 1 ) k *= x; x *= x; n /= 2; x %= mod; k %= mod; } return (k*x)%mod; } }