//52行目から編集
#include <iostream>
#include <limits.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <cassert>

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 all(x) (x).begin(),(x).end()
#define mp make_pair
#define pb push_back
#define eb emplace_back

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vector<int> > vvi;
typedef vector<vector<ll> > vvl;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;

template<class T> bool chmin(T& a,T b){if(a > b){a = b;return true;}else return false;}
template<class T> bool chmax(T& a,T b){if(a < b){a = b;return true;}else return false;}
///////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
/*
 * Modint構造体
 * */
const int mod = 1000000007;
struct mint {
  long long x; // typedef long long ll;
  mint(long long x=0):x((x%mod+mod)%mod){}
  mint& operator+=(const mint a) { if((x+=a.x)>=mod)x-=mod;return *this;}
  mint& operator-=(const mint a) { if((x+=mod-a.x)>=mod)x-=mod; return *this;}
  mint& operator*=(const mint a) { (x *=a.x)%=mod; return *this;}
  mint operator+(const mint a) const { mint res(*this);return res+=a;}
  mint operator-(const mint a) const { mint res(*this);return res-=a;}
  mint operator*(const mint a) const { mint res(*this);return res*=a;}
  mint pow(ll t) const {
    if (!t) return 1;mint a = pow(t>>1);a*=a;
    if (t&1) a *= *this;return a;
  }
  // for prime mod
  mint inv() const { return pow(mod-2);}
  mint& operator/=(const mint a) { return (*this) *= a.inv();}
  friend ostream& operator<<(ostream& os, const mint& m){os<<m.x;return os;}
};

int n;
mint facl[200020];
vector<int> g[200020];
mint dp1[200020];
mint dp2[200020];
vector<int> sz(200020,1);
vector<int> par(200020,-1);

void dfs1(int x,int p){
    dp1[x] = (mint)1;
    par[x] = p;
    for(int i : g[x]){
        if(i != p){
            dfs1(i,x);
            sz[x] += sz[i];
            dp1[x] *= dp1[i];
        }
    }
    dp1[x] *= facl[sz[x]-1];
    for(int i : g[x]){
        if(i != p){
            dp1[x] /= facl[sz[i]];
        }
    }
}
void dfs2(int x){
    int p = par[x];
    dp2[x] = dp1[x];

    //dp2[p] からdp1[x]を取り除く作業をする
    if(p != -1){
        mint dp_ = dp2[p];
        dp_ /= facl[n-1];
        dp_ *= facl[n-1-sz[x]];
        dp_ *= facl[sz[x]];
        dp_ /= dp1[x];
        //xにdp_をmergeする
        dp2[x] /= facl[sz[x]-1];
        dp2[x] *= facl[n-1];
        dp2[x] /= facl[n-sz[x]];
        dp2[x] *= dp_;
    }   

    for(int i : g[x]){
        if(i != p){
            dfs2(i);
        }
    }
}
int main(void){
    cin.tie(0);
    ios::sync_with_stdio(false);

    rep(i,200020){ if(i==0)facl[i]=1; else facl[i]=facl[i-1]*(mint)i; }
    cin >> n;
    rep(i,n-1){
        int a,b;cin >> a >> b;
        a--,b--; g[a].pb(b); g[b].pb(a);
    }
    dfs1(0,-1);
    dfs2(0);
    for(int i  =0;i < n;i++){
        cout << dp2[i] << '\n';
    }
}


Measured memory_bytes: 20212