#include #include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define all(x) (x).begin(), (x).end() #define ll long long #define ld long double #define INF 1000000000000000000 typedef pair pll; int main() { cin.tie(0); ios::sync_with_stdio(false); int N; cin >> N; ll MOD = pow(10, 9) + 7; vector> G(N, vector()); vector root(N, -1); rep(i, N - 1) { ll a, b; cin >> a >> b; a--, b--; G[a].push_back(b); root[b] = a; } ll s; rep(i, N) { if (root[i] == -1) { s = i; break; } } vector dist(N, -1); // 全頂点を「未訪問」に初期化 queue que; // 初期条件 (頂点 0 を初期ノードとする) dist[s] = 0; que.push(s); // 0 を橙色頂点にする // BFS 開始 (キューが空になるまで探索を行う) while (!que.empty()) { int v = que.front(); // キューから先頭頂点を取り出す que.pop(); // v から辿れる頂点をすべて調べる for (int nv : G[v]) { if (dist[nv] != -1) continue; // すでに発見済みの頂点は探索しない // 新たな白色頂点 nv について距離情報を更新してキューに追加する dist[nv] = dist[v] + 1; dist[nv] %= MOD; que.push(nv); } } ll ans = 0; rep(i, N) { ll tmp = dist[i] % MOD; if (dist[i] >= 2) { tmp = (1 + dist[i]) % MOD * dist[i] % MOD / 2; } ans += tmp; ans %= MOD; } cout << ans << endl; }