#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp> 
// #include <ext/pb_ds/tree_policy.hpp> 
using namespace std;
// using namespace __gnu_pbds;
#define rep(i, a, b) for (int (i) = (a); (i) < (b); ++(i))
#define per(i, a, b) for (int (i) = (a); (i) >= (b); --(i))
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define eb emplace_back
#define ff first
#define ss second
#define sz(x) ((int) x.size())
#define rd(type, ...) type __VA_ARGS__; sc(__VA_ARGS__)
#define rda(a, n) rep(i, 0, n) cin >> a[i];
#define rdaa(a, n, m) rep(i, 0, n) rep(j, 0, m) cin >> a[i][j];
#define rdv(type, v, n) vector<type> v(n); rep(__ii, 0, n) cin >> v[__ii]
#define rdm(type, v, h, w) vector<vector<type>> v(h, vector<type>(w)); rep(__ii, 0, h) rep(__jj, 0, w) cin >> v[__ii][__jj]
#define rdv2(type, n, ...)std::vector<type> __VA_ARGS__;MACRO_rdv2_Init(n, __VA_ARGS__); for(int w_=0; w_<n; ++w_){MACRO_rdv2_Scan(w_, __VA_ARGS__);}
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "] : ", debug_out(__VA_ARGS__)
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define err2(x) {wr(x); return;}
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
// typedef tree<int, null_type, less, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
void rset();
void init_test();
void solve();
signed main() {ios::sync_with_stdio(false); cin.tie(0);
  cout << fixed; cout.precision(20); init_test(); return 0;}
template<typename T> void chmin(T &a, T b) {if (a > b) a = b;}
template<typename T> void chmax(T &a, T b) {if (a < b) a = b;}
template<typename T> void MACRO_rdv2_Init(int n, T& t) { t.resize(n); }
template<typename First, typename... Rest> void MACRO_rdv2_Init(int n, First& first, Rest& ...rest) { first.resize(n); MACRO_rdv2_Init(n, rest...); }
template<typename T> void MACRO_rdv2_Scan(int p, T& t) { std::cin >> t[p]; }
template<typename First, typename... Rest> void MACRO_rdv2_Scan(int p, First& first, Rest& ...rest) { std::cin >> first[p]; MACRO_rdv2_Scan(p, rest...); }
template<typename T> void wrv(const vector<T> &v) {rep(__ii, 0, sz(v)) {if (__ii) cout << ' '; cout << v[__ii];} cout << '\n';} 
template<typename T> void wrm(const vector<vector<T>> &v) {rep(__ii, 0, sz(v)) {rep(__jj, 0, v[__ii].size()) {if (__jj) cout << ' '; cout << v[__ii][__jj];} cout << '\n';}}
template<typename T> void sc(T& x) {cin >> x;}
template<typename Head, typename... Tail> void sc(Head& head, Tail&... tail) {cin >> head; sc(tail...);}
template<typename T> void wr(const T& x) {cout << x << '\n';}
template<typename Head, typename... Tail> void wr(const Head& head, const Tail&... tail) {cout << head << ' '; wr(tail...);}
template<typename T> void wrf(const T& x) {cout << x << endl;}
template<typename Head, typename... Tail> void wrf(const Head& head, const Tail&... tail) {cout << head << ' '; wrf(tail...);}
template<typename T> void debug_out(const T& x) {cerr << x << '\n';}
template<typename Head, typename... Tail> void debug_out(const Head& head, const Tail&... tail) {cerr << head << ' '; debug_out(tail...);}
template<typename... T> void err(const T&... cod) {wr(cod...); exit(0);}

const int mod = 1e9 + 7;

void add_self(int &x, int y) {
  x += y;
  if (x >= mod)
    x -= mod;
}

void sub_self(int &x, int y) {
  x -= y;
  if (x < 0)
    x += mod;
}

int add(int x, int y) {
  x += y;
  if (x >= mod)
    x -= mod;
  return x;
}

int sub(int x, int y) {
  x -= y;
  if (x < 0)
    x += mod;
  return x;
}

int powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
  }
  return res % mod;
}

int mult(int x, int y) {
  return (1LL * x * y) % mod;
}

int inv(int x) {
  return powmod(x, mod - 2);
}

int divide(int x, int y) {
  return mult(x, inv(y));
}

const int N = 2e5 + 10;

int fact[N];

int n;
vi g[N];
int dp[N], dpc[N];
int ss[N];
int permute[N];
int ans[N];

int ncr(int n, int r) {
  if (r < 0 || r > n) return 0;
  int ans = fact[n];
  ans = divide(ans, fact[r]);
  ans = divide(ans, fact[n - r]);
  return ans;
}

void dfs_pre(int u, int p) {
  ss[u] = 1;
  permute[u] = fact[sz(g[u]) - (p != -1)];
  for (int v : g[u]) {
    if (v == p) continue;
    dfs_pre(v, u);
    ss[u] += ss[v];
    permute[u] = mult(permute[u], permute[v]);
  }
}

void dfs(int u, int p) {
  dpc[u] = 1;
  int slot = ss[u] - 1;
  // dbg(u + 1);
  for (int v : g[u]) {
    if (v == p) continue;
    dfs(v, u);
    dpc[u] = mult(dpc[u], mult(ncr(slot, ss[v]), permute[v]));
    slot -= ss[v];
  }
}

void dfs2(int u, int p) {
  dp[u] = 1;
  int slot = ss[u] - 1;
  // dbg(u + 1);
  for (int v : g[u]) {
    if (v == p) continue;
    dfs2(v, u);
    // dbg(v + 1, dpc[v], slot, ss[v]);
    dp[u] = mult(dp[u], mult(dp[v], ncr(slot, ss[v])));
    slot -= ss[v];
  }
}

void dfs3(int u, int p) {
  ans[u] = dp[u];
  for (int v : g[u]) {
    if (v == p) continue;
    dp[u] = divide(dp[u], mult(dp[v], ncr(ss[u] - 1, ss[v])));
    ss[u] -= ss[v];
    ss[v] += ss[u];
    dp[v] = mult(dp[v], mult(dp[u], ncr(ss[v] - 1, ss[u])));
    dfs3(v, u);
    dp[v] = divide(dp[v], mult(dp[u], ncr(ss[v] - 1, ss[u])));
    ss[v] -= ss[u];
    ss[u] += ss[v];
    dp[u] = mult(dp[u], mult(dp[v], ncr(ss[u] - 1, ss[v])));
  }
}

void solve() {
  fact[0] = 1;
  rep(i, 1, N) fact[i] = mult(i, fact[i - 1]);

  cin >> n;
  rep(i, 0, n - 1) {
    rd(int, u, v);
    --u, --v;
    g[u].pb(v);
    g[v].pb(u);
  }

  dfs_pre(0, -1);
  dfs(0, -1);
  dfs2(0, -1);
  dfs3(0, -1);

  // wr(dp[0]);

  rep(i, 0, n) wr(ans[i]);
  // rset();
}

void init_test() {
  // freopen("input.txt", "r", stdin);
  // freopen("output.txt", "w", stdout);
  int qq = 1;
  // cin >> qq;
  while (qq--) solve();
}

Measured memory_bytes: 18676