#include<iostream>
#include<vector>
#include<utility>
using namespace std;
#define VI vector<int>
#define VII vector< vector<pair<int,int> > >
#define MOD ( ((int)(1e9)+7) )
long long int dfs(int vertex,VII& adj,long long int& tweight)
{
int i;
long long int rootCost = 0LL,childCost = 0LL,leafCost = 0LL;
if( adj[vertex].size() == 0 )
return 0LL;
for(i=0;i<adj[vertex].size();i++)
{
int adjNode = adj[vertex][i].first;
int adjCost = adj[vertex][i].second;
leafCost = dfs(adjNode,adj,tweight);
tweight = ( tweight + leafCost ) % MOD;
leafCost = ( leafCost * adjCost + adjCost ) % MOD;
rootCost = ( childCost * leafCost ) % MOD; /* Path that passes along the root */
childCost = ( childCost + leafCost ) % MOD; /* Path that starts at the root and end at any child node */
tweight = ( tweight + rootCost ) % MOD;
}
return childCost;
}
int main()
{
std::ios_base::sync_with_stdio(false);
int n,i,x,y,w;
long long int tweight = 0LL;
cin>>n;
VII adj(n+2);
for(i=1;i<=(n-1);i++)
{
cin>>x>>y>>w;
if( x > y )
std::swap(x,y);
adj[x].push_back(make_pair(y,w));
}
tweight = ( tweight + dfs(1,adj,tweight) ) % MOD; /* 1 will be the root always */
cout<<tweight<<endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgVkkgdmVjdG9yPGludD4KI2RlZmluZSBWSUkgdmVjdG9yPCB2ZWN0b3I8cGFpcjxpbnQsaW50PiA+ID4KI2RlZmluZSBNT0QgKCAoKGludCkoMWU5KSs3KSApCgpsb25nIGxvbmcgaW50IGRmcyhpbnQgdmVydGV4LFZJSSYgYWRqLGxvbmcgbG9uZyBpbnQmIHR3ZWlnaHQpCnsKCWludCBpOwoJbG9uZyBsb25nIGludCByb290Q29zdCA9IDBMTCxjaGlsZENvc3QgPSAwTEwsbGVhZkNvc3QgPSAwTEw7IAoKCWlmKCBhZGpbdmVydGV4XS5zaXplKCkgPT0gMCApCgkJcmV0dXJuIDBMTDsKCQoJZm9yKGk9MDtpPGFkalt2ZXJ0ZXhdLnNpemUoKTtpKyspCgl7CgkJaW50IGFkak5vZGUgPSBhZGpbdmVydGV4XVtpXS5maXJzdDsKCQlpbnQgYWRqQ29zdCA9IGFkalt2ZXJ0ZXhdW2ldLnNlY29uZDsKCgkJbGVhZkNvc3QgPSBkZnMoYWRqTm9kZSxhZGosdHdlaWdodCk7CgoJCXR3ZWlnaHQgPSAoIHR3ZWlnaHQgKyBsZWFmQ29zdCApICUgTU9EOwoJCWxlYWZDb3N0ID0gKCBsZWFmQ29zdCAqIGFkakNvc3QgKyBhZGpDb3N0ICkgJSBNT0Q7CgoJCXJvb3RDb3N0ID0gKCBjaGlsZENvc3QgKiBsZWFmQ29zdCApICUgTU9EOyAvKiBQYXRoIHRoYXQgcGFzc2VzIGFsb25nIHRoZSByb290ICovCgkJY2hpbGRDb3N0ID0gKCBjaGlsZENvc3QgKyBsZWFmQ29zdCApICUgTU9EOyAvKiBQYXRoIHRoYXQgc3RhcnRzIGF0IHRoZSByb290IGFuZCBlbmQgYXQgYW55IGNoaWxkIG5vZGUgKi8KCgkJdHdlaWdodCA9ICggdHdlaWdodCArIHJvb3RDb3N0ICkgJSBNT0Q7Cgl9CgoJcmV0dXJuIGNoaWxkQ29zdDsKfQoKaW50IG1haW4oKQp7CglzdGQ6Omlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJaW50IG4saSx4LHksdzsKCWxvbmcgbG9uZyBpbnQgdHdlaWdodCA9IDBMTDsKCWNpbj4+bjsKCglWSUkgYWRqKG4rMik7CgoJZm9yKGk9MTtpPD0obi0xKTtpKyspCgl7CgkJY2luPj54Pj55Pj53OwoJCWlmKCB4ID4geSApCgkJCXN0ZDo6c3dhcCh4LHkpOwoJCWFkalt4XS5wdXNoX2JhY2sobWFrZV9wYWlyKHksdykpOwkKCX0KCXR3ZWlnaHQgPSAoIHR3ZWlnaHQgKyBkZnMoMSxhZGosdHdlaWdodCkgKSAlIE1PRDsgLyogMSB3aWxsIGJlIHRoZSByb290IGFsd2F5cyAqLwoJY291dDw8dHdlaWdodDw8ZW5kbDsKfQo=