#include #include using namespace std; using mint = atcoder::modint1000000007; template struct csr { struct Node { csr* g; int u; template void emplace_back(Args&&... args){ g->add_edge(u, T(std::forward(args)...)); } auto begin(){ return g->E.begin() + g->start[u]; } auto end(){ return g->E.begin() + g->start[u + 1]; } int size(){ return g->start[u + 1] - g->start[u]; } T& operator[](int p){ return *(begin() + p); } }; int N; std::vector start; std::vector E; std::vector> edge; csr(int n) : N(n), start(n + 1) {edge.reserve(n);} void add_edge(int u, T v){ assert(0 <= u && u < N); start[u + 1]++; edge.emplace_back(u, v); } void build(){ E.resize(edge.size()); for(int i = 0; i < N; i++) start[i + 1] += start[i]; auto cnt = start; for(auto [u, v] : edge) E[cnt[u]++] = v; } const int size() {return N;} Node operator[](int u) {return Node{this, u};} }; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n, r = 0; cin >> n; vector p(n, -1); csr g(n); for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; u--, v--; g[u].emplace_back(v); p[v] = u; } while(p[r] != -1) r = p[r]; g.build(); int cur = 0, dep = 0; mint ans = 0; auto dfs = [&](auto dfs, int v, int p) -> int { int sz = 1; for(auto u : g[v]){ if(u == p) continue; dep++; sz += dfs(dfs, u, v); dep--; } ans += mint::raw(dep) * sz; return sz; }; dfs(dfs, r, -1); cout << ans.val() << '\n'; }