#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep0(N) for (int COUNTER = 0; COUNTER < (int)(N); COUNTER++)
#define rep(i, N) for (int i = 0; i < (int)(N); i++)
#define rep1(i, N) for (int i = 0; i < (int)(N); i++)
#define rep2(i, START, GOAL) for (int i = (int)(START); i < (int)(GOAL); i++)
#define rep3(i, START, GOAL) for (int i = (int)(START); i > (int)(GOAL); i--)
#define ALL(CONTAINER) CONTAINER.begin(), CONTAINER.end()
#define rALL(CONTAINER) CONTAINER.rbegin(), CONTAINER.rend()
#define from1(CONTAINER) CONTAINER.begin() + 1, CONTAINER.end()
#define rfrom1(CONTAINER) CONTAINER.rbegin(), CONTAINER.rend() - 1
#define output(X) cout << X << "\n"
#define dberr(X) cerr << X << "\n"
#define db(X) cerr << #X << ":" << (X) << " "
#define dbl(X) cerr << #X << ":" << (X) << "\n"
#define db2(X, Y) cerr << #X << ":" << (X) << ", " << #Y << ":" << (Y) << " "
#define db2l(X, Y) cerr << #X << ":" << (X) << ", " << #Y << ":" << (Y) << "\n"
#define dbl2(X, Y) cerr << #X << ":" << (X) << "\n" << #Y << ":" << (Y) << "\n"
#define db3(X, Y, Z) cerr << #X << ":" << (X) << ", " << #Y << ":" << (Y) << " " << #Z << ":" << (Z) << " "
#define db3l(X, Y, Z) cerr << #X << ":" << (X) << ", " << #Y << ":" << (Y) << ", " << #Z << ":" << (Z) << "\n"
#define dbl3(X, Y, Z) cerr << #X << ":" << (X) << "\n" << #Y << ":" << (Y) << "\n" << #Z << ":" << (Z) << "\n"
#define dbp(PAIR) cerr << #PAIR << ":(" << PAIR.first << ", " << PAIR.second << ") "
#define dbpl(PAIR) cerr << #PAIR << ":(" << PAIR.first << ", " << PAIR.second << ")\n"
#define dbt3(TUPLE3) cerr << #TUPLE3 << ":(" << get<0>(TUPLE3) << ", " << get<1>(TUPLE3) << ", " << get<2>(TUPLE3) << ") "
#define dbt3l(TUPLE3) cerr << #TUPLE3 << ":(" << get<0>(TUPLE3) << ", " << get<1>(TUPLE3) << ", " << get<2>(TUPLE3) << ")\n"
#define dbt4(TUPLE4) cerr << #TUPLE4 << ":(" << get<0>(TUPLE4) << ", " << get<1>(TUPLE4) << ", " << get<2>(TUPLE4) << ", " << get<3>(TUPLE4) << ") "
#define dbt4l(TUPLE4) cerr << #TUPLE4 << ":(" << get<0>(TUPLE4) << ", " << get<1>(TUPLE4) << ", " << get<2>(TUPLE4) << ", " << get<3>(TUPLE4) << ")\n"
#define dbv(VEC) cerr << #VEC << ":{ "; for (auto ELEM : VEC) cerr << ELEM << ", "; cerr << "}\n"
#define dbvp(VP) cerr << #VP << ":{ "; for (auto PAIR : VP) cerr << "(" << PAIR.first << ", " << PAIR.second << "), "; cerr << "}\n"
#define dbvv(VV) cerr << #VV << ":{\n"; for (auto VEC : VV) { cerr << "{ "; for (auto ELEM : VEC) cerr << ELEM << ", "; cerr << "},\n"; } cerr << "}\n"
#define dbvvp(VVP) cerr << #VVP <<":{\n"; for (auto VP : VVP) { cerr << "{ "; for (auto PAIR : VP) { cerr << "(" << PAIR.first << ", " << PAIR.second << "), "; } cerr << "},\n"; } cerr << "}\n";
#define dbm(MAP) cerr << #MAP << ":{ "; for (auto PAIR : MAP) cerr << "(" << PAIR.first << ", " << PAIR.second << "), "; cerr << "}\n"
#define YN(f) cout << (f ? "YES" : "NO") << "\n"
#define Yn(f) cout << (f ? "Yes" : "No") << "\n"
#define yn(f) cout << (f ? "yes" : "no") << "\n"
using ll = long long;
using vi = vector<int>; using vl = vector<ll>; using vd = vector<double>; using vs = vector<string>; using vb = vector<bool>;
using vvi = vector<vi>; using vvl = vector<vl>; using vvd = vector<vd>; using vvb = vector<vb>;
using pii = pair<int, int>; using pil = pair<int, ll> ; using pli = pair<ll, int>; using pll = pair<ll, ll>; using pdd = pair<double, double>;
using vpii = vector<pii>; using vpll = vector<pll>; using vpdd = vector<pdd>;
using ti3 = tuple<int, int, int>; using tl3 = tuple<ll, ll, ll>; using td3 = tuple<double, double, double>;
using ti4 = tuple<int, int, int, int>; using tl4 = tuple<ll, ll, ll, ll>; using td4 = tuple<double, double, double, double>;
using mii = map<int, int>; using mil = map<int, ll>; using mli = map<ll, int>; using mll = map<ll, ll>;
using si = set<int>; using sl = set<ll>;
// db

const int MOD = 1e9 + 7; // 998244353; // 1e9 + 9;
ll rem(ll x) {
	x %= MOD; if(x < 0) x += MOD;
	return x;
}
ll madd(ll x, ll y) {
	return (rem(x) + rem(y)) % MOD;
}
ll msub(ll x, ll y) {
	return madd(x, -y);
}
ll mmul(ll x, ll y) {
	return rem(x) * rem(y) % MOD;
}
ll mpow(ll x, ll n) {
	assert(n >= 0);
	ll res = 1;
	while (n > 0) {
		if (n & 1) res = mmul(res, x);
		x = mmul(x, x);
		n >>= 1;
	}
	return res;
}
ll inv(ll x) {
	assert(x % MOD != 0);
	return mpow(x, MOD - 2);
}
ll mdiv(ll x, ll y) {
	return mmul(x, inv(y));
}

int N;
vvi g, ch, k; // ch[v]:vの子のリスト，k[v]:kから生える部分木の頂点数のリスト
vi dp1, dp2; // 前方(葉側/根側)の頂点の数
vb r;

void dfs1(int u) {
	r[u] = true;
	for (int v : g[u]) {
		if (r[v]) continue;		
		ch[u].push_back(v);		
		dfs1(v);
		k[u].push_back(1 + dp1[v]);
		dp1[u] += 1 + dp1[v];
	}
}

void dfs2(int u) {
	for (int v : ch[u]) {
		dp2[v] = dp2[u] + dp1[u] - dp1[v];
		k[v].push_back(dp2[v]);
		dfs2(v);
	}
}

const ll half = inv(2);

ll solve(int i) {
	int d = k[i].size();
	assert(d > 0);
	if (d == 1) return 0; // 端点は穴になり得ない	
	// iが穴でない場合は以下(互いに排反)
	// (1) iが黒(確率1/2)
	ll p1 = half;
	// (2) iが白(確率1/2)で，かつ，
	// (2-1) どの部分木にも黒がない(すなわち他の頂点が全て白)
	ll p21 = mpow(half, N);
	// (2-2) 黒のある部分木がちょうど1つ
	//  ※黒のある部分木⇔「白が1つもない部分木」でない部分木
	ll p22 = 0;
	for (int kj : k[i]) {
		// db(kj);
		ll temp = mmul(msub(1, mpow(half, kj)), mpow(half, N - kj));
		// dbl(temp);
		p22 = madd(p22, temp);
	}	
	ll res = 1;
	res = msub(res, p1);
	res = msub(res, madd(p21, p22));
	// dbt3(tl3(p1, p21, p22)); dbl(res);
	return res;
}

int main() {
	cin >> N;
	g.assign(N, {}); ch.assign(N, {}); k.assign(N, {});
	rep0(N - 1) {
		int A, B; cin >> A >> B;
		A--; B--;
		g[A].push_back(B); g[B].push_back(A);		
	}
	// dbvv(g);
	dp1.assign(N, {});
	r.assign(N, false);	
	dfs1(0);
	// dbvv(ch); dbv(dp1);
	dp2.assign(N, 0);
	dfs2(0);
	// dbv(dp2);
	// dbvv(k);

	ll ans = 0;
	rep(i, N) ans = madd(ans, solve(i));
	output(ans);
}

Measured memory_bytes: 166400