---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------——————-------------------------------------------------------------------------------------------------------------------------------------------------------
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,mod=1e9+7;
int n;
// 维护连通块
int fa[N],siz[N],cnt[N];
set<int>st;
int find(int x){
if(x==fa[x])return fa[x];
return fa[x]=find(fa[x]);
}
void merge(int x,int y,int c){// c is the length of the link
x=find(x),y=find(y);
fa[x]=y;
siz[y]+=siz[x]+c-2;
cnt[y]+=cnt[x]-2;
st.erase(x);
}
// links
struct links{
int u,v,c;
}l[N];
vector<int>g[N];
// setup
int ksm(int a,int b){
int s=1;
while(b){
if(b&1)(s*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return s;
}
int fac[N],ifac[N],d[N];
void setup(){
fac[0]=1;
for(int i=1;i<N;i++)fac[i]=(fac[i-1]i)%mod;
ifac[N-1]=ksm(fac[N-1],mod-2);
for(int i=N-2;i>=0;i--)ifac[i]=(ifac[i+1](i+1))%mod;
cin>>n;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
g[u].emplace_back(v);
g[v].emplace_back(u);
d[u];d[v];
}
for(int i=1;i<=n;i++){
if(d[i]!=2){// 刚开始所有边都是非法边,所以 cnt 必为 d[i],siz 必为 1
fa[i]=i;
siz[i]=1;
cnt[i]=d[i];
st.insert(i);
}
}
}
int id;
void dfs(int x,int f,int hd,int c){
// hd:当前这个链的另一端 c:当前这个链的长度
if(d[x]!=2){// 这个点的度不是 2,则是一个链的端点
if(hd)l[id]={hd,x,c};
c=1;
hd=x;
}
for(int y:g[x])if(y!=f){
dfs(y,x,hd,c+1);
}
}
int ans[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
setup();
// 搞链
dfs(*st.begin(),0,0,0);// 从 *st.begin() 开始可以保证扫的根是链的端点
sort(l+1,l+1+id,[](links x,links y){
return x.c<y.c;
});
ans[n]=fac[n];
int x=1;
for(int k=n-1;k>=1;k--){
while(x<=id&&k<n-l[x].c){
merge(l[x].u,l[x].v,l[x].c);
x;
}
ans[k]=fac[k];
for(int i:st){
(ans[k]=ifac[(cnt[i]-1)(n-k-1)+siz[i]-1])%=mod;
}
}
for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
return 0;
}