//  RAKSHIT KADAM
//ALWAYS USE &IT FOR ITERATING USING AUTO ...
//USE COUNT(STARTING ADDRESS, ENDING ADRESS ,VALUE) FOR FINDING THE COUNT IN THE RESPECTIVE DATA STRUCTURE
//NOTE THAT MEMSET CANNOT ASSIGN A VALUE OF 10^18 IT WILL ASSIGN A LOWER VALUE THAN THAT!!!
//NOTE THAT MEMSET CANT FILL THE DOUBLE VALUES;
//ACCUMULATE DOES NOT WORK PROPERLY IF VALUES START SUMMING BEYOND 1E9...
 #include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// #define ordered_set tree< int ,  null_type ,  less<int> ,  rb_tree_tag ,  tree_order_statistics_node_update>
#warning !!!check the size of arrayss!!!

// NUMERIC DEFINITIONS :
    #define INF 2000000000000000005
    #define MOD  1000000007
    #define newMOD  998244353
    #define MAX 300006
    #define pi 3.1415926535897932384626433832795
#define ld long double
 #define ll long long
 #define int long long

 #define P(gg) for(auto rax:gg){cout<<rax<<" ";}cout<<endl;
 #define Need_for_speed(activated) ios_base :: sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
 #define satisfy ll t; cin>> t; while(t--)
 #define inp(n) int n;cin >> n
 #define mp make_pair
 #define pb push_back
 #define endl "\n"
 #define x first
 #define y second
 #define fore(i,a,b) for(ll i=a;i<b;i++)
 #define forci(i,n) for(ll i=0;i<n;i++)
 #define vi vector<ll>
 #define Endl endl
 #define lb lower_bound
 #define ub upper_bound
#define pii pair<ll,ll>

 #define input freopen("input.txt", "r", stdin),freopen("output.txt", "w", stdout)
 #define time        cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
using namespace std;

ll gcd(ll a, ll b){if (b == 0)return a;return gcd(b, a % b);}
int power(int x, unsigned int y, unsigned int m){ if (y == 0) return 1;int p = power(x, y/2, m) % m;  p = (p * p) % m;                                                  return (y%2 == 0)? p : (x * p) % m;}
ll modInverse(int a, int m){int g = gcd(a, m); { return power(a, m-2, m);}}
ll n;
const int maxn = 200006;
vi v[maxn];
ll dp[maxn];
ll sub_size[maxn];
ll fact[maxn];
ll ans[maxn];
#define iff if(root==3)
void dfs(ll root,ll par)
{
    sub_size[root]=1;dp[root]=1;
    for(auto it:v[root])
    {
        if(it==par)continue;
        dfs(it,root);
        sub_size[root]+=sub_size[it];
        (dp[root]*=dp[it])%=MOD;
        (dp[root]*=modInverse(fact[sub_size[it]],MOD))%=MOD;
    }
    (dp[root]*=(fact[sub_size[root]-1]))%=MOD;
}
void dfs_ans(ll root ,ll par)
{
    ans[root]=1;
    ll parx =sub_size[par];
    ll rootx = sub_size[root];
    
    if(par)
   { sub_size[par] -= sub_size[root];
    sub_size[root] += sub_size[par];
       dp[par]=ans[par];
    (dp[par]*=(fact[sub_size[par]-1]))%=MOD;
       
    (dp[par]*=modInverse(fact[parx-1],MOD))%=MOD;
       
    (dp[par]*=fact[rootx])%=MOD;
      
       (dp[par]*=modInverse(dp[root],MOD))%=MOD;
    }
    
     (ans[root]*=(fact[sub_size[root]-1]))%=MOD;
    
    for(auto it:v[root])
    {
      
            (ans[root]*=dp[it])%=MOD;
            (ans[root]*=modInverse(fact[sub_size[it]],MOD))%=MOD;
        
       
    }
    for(auto it:v[root])
    {
        if(it!=par)
               {
                   dfs_ans(it,root);
               }
    }
    if(par)
    {
        (dp[par]*=(modInverse(fact[sub_size[par]-1],MOD)))%=MOD;
    (dp[par]*=fact[parx-1])%=MOD;
    (dp[par]*=modInverse(fact[rootx],MOD))%=MOD;
        (dp[par]*=dp[root])%=MOD;
    sub_size[root] -= sub_size[par];
    sub_size[par] += sub_size[root];
    }
}

void solve()
{
    fact[0]=1;
    for(ll i=1;i<maxn;i++)
    {
        fact[i]=(fact[i-1]*i)%MOD;
    }
    cin>>n;ll x,y;
    for(ll i=0;i<n-1;i++)
    {
        cin>>x>>y;
        v[x].pb(y);v[y].pb(x);
    }
    dfs(1,0);
    dfs_ans(1,0);
    
    for(ll i=1;i<=n;i++)cout<<ans[i]<<endl;
    
}

signed main()
{
   
    Need_for_speed(activated);
//satisfy
//    {
//   solve();
//   }
   
    solve();
    return 0;
}


Measured memory_bytes: 20976