#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DEBUG_OUTPUT_ENABLED 1
	#define DBG(X) dout << #X << "=" << (X) << '\n';
	#define SAY(X) dout << (X) << '\n';
#else
	#define DEBUG_OUTPUT_ENABLED 0
	#define DBG(X) 42;
	#define SAY(X) 42;
#endif

#define dout   debug::instance

using namespace std;

template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
namespace debug {
	struct DebugStream {
		private:
			bool is_first;
		public:
			DebugStream(bool _is_first): is_first(_is_first) {}
			template<typename T> DebugStream operator<<(const T& value) const {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				cout << value;
				return DebugStream(false);
			};

			template<typename T> DebugStream printArray(T* l, T* r) {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				while(l != r) {
					cout << (*l);
					++l;
					if(l == r) {
						cout << '\n';
					} else {
						cout << ' ';
					}
				}
				return DebugStream(false);
			}
	};
	DebugStream instance(true);
};

using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }
const int MAXN = (int)2e5 + 777;
const int MOD  = (int)1e9 + 7;
inline int add(int x, int y) {
	return (x + y >= MOD ? x + y - MOD : x + y);
}
inline int sub(int x, int y) {
	return (x - y < 0 ? x - y + MOD : x - y);
}
inline int mult(int x, int y) {
	ll r = x * 1LL * y;
	if(r >= MOD) r %= MOD;
	return (int)r;
}
int binpow(int x, int y) {
	if(x == 1 || y == 0) return 1;
	if(x == 0) return 0;
	int rez = binpow(x, y >> 1);
	rez = mult(rez, rez);
	if(y & 1) rez = mult(rez, x);
	return rez;
}
inline int divide(int x, int y) {
	return mult(x, binpow(y, MOD - 2));
}
int F[MAXN], RF[MAXN];
inline void init() {
	F[0] = 1; for(int i = 1; i < MAXN; ++i) F[i] = mult(F[i - 1], i);
	assert(F[5] == 120 % MOD);
	RF[MAXN - 1] = divide(1, F[MAXN - 1]);
	for(int i = MAXN - 2; i >= 0; --i) RF[i] = mult(i + 1, RF[i + 1]);
	assert(mult(F[1234], RF[1234]) == 1 % MOD);
}
struct Data {
	int ways, sz;
	Data(): ways(1), sz(0) {}
	Data(int _w, int _s): ways(_w), sz(_s) {}
};
Data merge(const Data& lhs, const Data& rhs) {
	Data rez;
	rez.sz = lhs.sz + rhs.sz;
	rez.ways = mult(lhs.ways, rhs.ways);
	rez.ways = mult(rez.ways, F[rez.sz]);
	rez.ways = mult(rez.ways, RF[lhs.sz]);
	rez.ways = mult(rez.ways, RF[rhs.sz]);
	return rez;
}
vector<int> G[MAXN];
int n, root;
Data down[MAXN], up[MAXN];
void dfs(int v, int prv) {
	for(auto& u: G[v]) if(u != prv) {
		dfs(u, v);
		down[v] = merge(down[v], down[u]);
	}
	++down[v].sz;
}
void efs(int v, int prv) {
	vector<int> C;
	for(auto& u: G[v]) if(u != prv) {
		C.emplace_back(u);
	}
	int cnt = len(C);
	vector<Data> pref(cnt + 1);
	vector<Data> suff(cnt + 1);
	for(int i = 1; i <= cnt; ++i) {
		pref[i] = merge(down[C[i - 1]], pref[i - 1]);
		suff[i] = merge(down[C[cnt - i]], suff[i - 1]);
	}
	for(int i = 0; i < cnt; ++i) {
		Data loc = merge(pref[i], suff[cnt - i - 1]);
		loc = merge(loc, up[v]);
		++loc.sz;
		up[C[i]] = merge(up[C[i]], loc);
	}
	for(auto& u: C) efs(u, v);
}
void solve() {
	init();
	cin >> n; for(int i = 0; i < n - 1; ++i) {
		int v = fetch<int>() - 1;
		int u = fetch<int>() - 1;
		G[v].emplace_back(u);
		G[u].emplace_back(v);
	}
	root = 0;
	dfs(root, NIL); efs(root, NIL);
	for(int v = 0; v < n; ++v) {
		--down[v].sz;
		Data answ = merge(down[v], up[v]);
		++down[v].sz;
		cout << answ.ways << '\n';
	}
}

int main() {
	fast_io();
	solve();

	return 0;
}


Measured memory_bytes: 24192