#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define rrep(i,n) for(int i=(n)-1; i>=0; i--)
#define FOR(i,a,b) for(int i=(a); i<(b); i++)
#define RFOR(i,a,b) for(int i=(b-1); i>=(a); i--)
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );
#define pb push_back
using ll = long long;
using D = double;
using LD = long double;
using P = pair<int, int>;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

template<int mod> struct Fp {
    long long val;
    constexpr Fp(long long v = 0) noexcept : val(v % mod) {
        if (val < 0) val += mod;
    }
    constexpr int getmod() { return mod; }
    constexpr Fp operator - () const noexcept {
        return val ? mod - val : 0;
    }
    constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
    constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
    constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
    constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
    constexpr Fp& operator += (const Fp& r) noexcept {
        val += r.val;
        if (val >= mod) val -= mod;
        return *this;
    }
    constexpr Fp& operator -= (const Fp& r) noexcept {
        val -= r.val;
        if (val < 0) val += mod;
        return *this;
    }
    constexpr Fp& operator *= (const Fp& r) noexcept {
        val = val * r.val % mod;
        return *this;
    }
    constexpr Fp& operator /= (const Fp& r) noexcept {
        long long a = r.val, b = mod, u = 1, v = 0;
        while (b) {
            long long t = a / b;
            a -= t * b; swap(a, b);
            u -= t * v; swap(u, v);
        }
        val = val * u % mod;
        if (val < 0) val += mod;
        return *this;
    }
    constexpr bool operator == (const Fp& r) const noexcept {
        return this->val == r.val;
    }
    constexpr bool operator != (const Fp& r) const noexcept {
        return this->val != r.val;
    }
    friend constexpr ostream& operator << (ostream &os, const Fp<mod>& x) noexcept {
        return os << x.val;
    }
    friend constexpr Fp<mod> modpow(const Fp<mod> &a, long long n) noexcept {
        if (n == 0) return 1;
        auto t = modpow(a, n / 2);
        t = t * t;
        if (n & 1) t = t * a;
        return t;
    }
};

template<class T> struct BiCoef {
    vector<T> fact_, inv_, finv_;
    constexpr BiCoef() {}
    constexpr BiCoef(int n) noexcept : fact_(n, 1), inv_(n, 1), finv_(n, 1) {
        init(n);
    }
    constexpr void init(int n) noexcept {
        fact_.assign(n, 1), inv_.assign(n, 1), finv_.assign(n, 1);
        int mod = fact_[0].getmod();
        for(int i = 2; i < n; i++){
            fact_[i] = fact_[i-1] * i;
            inv_[i] = -inv_[mod%i] * (mod/i);
            finv_[i] = finv_[i-1] * inv_[i];
        }
    }
    constexpr T com(int n, int k) const noexcept {
        if (n < k || n < 0 || k < 0) return 0;
        return fact_[n] * finv_[k] * finv_[n-k];
    }
    constexpr T fact(int n) const noexcept {
        if (n < 0) return 0;
        return fact_[n];
    }
    constexpr T inv(int n) const noexcept {
        if (n < 0) return 0;
        return inv_[n];
    }
    constexpr T finv(int n) const noexcept {
        if (n < 0) return 0;
        return finv_[n];
    }
};

const int mod = 1e9+7;
using mint = Fp<mod>;
BiCoef<mint> bc;

const int MAX_N = 200005;

struct data {
    mint dp;
    int sz;
    data(mint dp = 1, int sz = 0) : dp(dp), sz(sz) {}
    data operator+ (const data& a) const { /* merge nodes */
        return data(bc.com(sz + a.sz, sz) * dp * a.dp, sz + a.sz);
    }
    data addRoot() const { /* include parent */
        return data(dp, sz+1);
    }
};

vector<int> g[MAX_N];
vector<data> dp[MAX_N];
data ans[MAX_N];

data dfs1(int v, int p = -1) {
    data dpsum;
    dp[v] = vector<data> (g[v].size());

    rep(i, (int)g[v].size()) {
        int u = g[v][i];
        if(u == p) continue;
        dp[v][i] = dfs1(u, v);
        dpsum = dpsum + dp[v][i];
    }
    return dpsum.addRoot();
}

void dfs2(int v, const data& dpP = data(), int p = -1) {
    int deg = g[v].size();
    rep(i, deg) if(g[v][i] == p) dp[v][i] = dpP;

    vector<data> dpsum_left(deg+1), dpsum_right(deg+1);
    rep(i,deg) dpsum_left[i+1] = dpsum_left[i] + dp[v][i];
    rrep(i, deg) dpsum_right[i] = dpsum_right[i+1] + dp[v][i];

    ans[v] = dpsum_left[deg].addRoot();

    rep(i,deg) {
        int u = g[v][i];
        if(u == p) continue;
        data d = dpsum_left[i] + dpsum_right[i+1];
        dfs2(u, d.addRoot(), v);
    }
}

int main() {
    bc.init(MAX_N);
    int n; cin >> n;
    rep(i,n-1) {
        int a,b; cin >> a >> b; a--; b--;
        g[a].pb(b); g[b].pb(a);
    }
    dfs1(0);
    dfs2(0);

    rep(i,n) cout << ans[i].dp << endl;
}


Measured memory_bytes: 40052