# 1-idx # LCAっぽい気がしている。 # 長さから含まれるpathの総和は求められる # 包除原理っぽくやる。 import sys input = sys.stdin.buffer.readline mod = 10 ** 9 + 7 n = int(input()) graph = [[] for _ in range(n + 1)] in_num = [0] * (n + 1) par = [-1] * (n + 1) for _ in range(n - 1): a, b = map(int, input().split()) par[b] = a graph[a].append(b) root = -1 # 根がどれか確認 for i in range(1, n + 1): if par[i] == -1: root = i assert root > 0 # 考慮すべき葉のリストを作る mattan = [] # 長さi経路に含まれるpathの和 def path_calc(length): return (length * (length + 1) * (length + 2) // 6) % mod # LCAの準備のeuler&first&depth heavyはいらんな。 def dfs(start): idx = 0 euler = [] depth = [-1] * (n + 1) depth[start] = 0 stack = [] first = [-1] * (n + 1) stack.append(~start) stack.append(start) while stack: v = stack.pop() if v > 0: d = depth[v] euler.append(v) first[v] = idx idx += 1 # 子供がないところは末端。 if not graph[v]: mattan.append(v) for u in graph[v]: depth[u] = d + 1 stack.append(~u) stack.append(u) else: a = ~v euler.append(par[a]) idx += 1 return depth, euler, first depth, euler, first = dfs(root) # segment tree nagasa = len(euler) num = 2 ** (nagasa.bit_length()) infi = 10 ** 10 SEG = [infi] * (2 * num) def func(a, b): return min(a, b) def update(idx, val): idx += num SEG[idx] = val while idx > 0: idx //= 2 SEG[idx] = func(SEG[2 * idx], SEG[2 * idx + 1]) def query(a, b): # 閉区間。 res = infi a += num b += num while b - a > 0: if (a & 1) == 1: res = func(res, SEG[a]) a += 1 if (b & 1) == 0: res = func(res, SEG[b]) b -= 1 a //= 2 b //= 2 if a == b: res = func(SEG[a], res) return res for idx, val in enumerate(euler): update(idx, depth[val]) nagasa = len(mattan) if nagasa == 1: ans = path_calc(depth[mattan[-1]]) % mod else: ans = path_calc(depth[mattan[0]]) % mod for i in range(1, nagasa): # print(ans) now = mattan[i] NOW = first[now] pre = mattan[i - 1] PRE = first[pre] ans += path_calc(depth[now]) ans %= mod if NOW < PRE: NOW, PRE = PRE, NOW sosen = query(PRE, NOW) ans -= path_calc(sosen) ans %= mod print(ans)