#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_>=V_##_END; V_--)
#ifdef _WIN32
#define long int64_t
#endif
#define fir first
#define sec second
#define _UN using namespace
using namespace std;
typedef pair<int,int> pii;
typedef __int128 i128;
const int MAXN=7010; const int INF=0x3f3f3f3f,MOD=998244353;
void addto(long& x,long y){ x=(x+y)%MOD; }
int n; vector<int> G[MAXN]; long ans[MAXN];
long fac[MAXN],inv[MAXN];
int dfs1(int u,int fa,pii& rt){
int s=1,mx=0;
for(int v:G[u]){
if(v!=fa){ int x=dfs1(v,u,rt); s+=x,mx=max(mx,x); }
}
mx=max(mx,n-s);
rt=min(rt,{mx,u});
return s;
}
int siz[MAXN],bel[MAXN],fa[MAXN];
vector<int> vec[MAXN];
void dfs2(int u,int fa_){
siz[u]=1,fa[u]=fa_;
for(int v:G[u]){
if(v!=fa_) bel[v]=bel[u]?bel[u]:v,dfs2(v,u),siz[u]+=siz[v];
}
vec[siz[u]].push_back(u);
}
long C(int x,int y){ return fac[x]*inv[y]%MOD*inv[x-y]%MOD; }
long qpow(long x,long p){
long ret=1;
for(; p; p>>=1,x=x*x%MOD){
if(p&1) ret=ret*x%MOD;
}
return ret;
}
struct Poly{
vector<long> A; int len;
void init(int len_){ len=len_,A.resize(len+1); }
void upd1(int a){ // *=y^a
if(a>=0) memmove(A.data()+a,A.data(),(len+1-a)*sizeof(A[0])),fill(A.begin(),A.begin()+a,0);
else a*=-1,memmove(A.data(),A.data()+a,(len+1-a)*sizeof(A[0])),fill(A.end()-a,A.end(),0);
}
void upd2(int a){ // *=(y^a-1)
if(a>=0){
IRNG(i,len,0){
if(i+a<=len) addto(A[i+a],A[i]);
A[i]=(MOD-A[i])%MOD;
}
}else{ // *=-(y^0+y^a+y^2a)
a*=-1;
RNG(i,0,len) A[i]=(MOD-A[i])%MOD;
RNG(i,0,len){
if(i+a<=len) addto(A[i+a],A[i]);
}
}
}
void add(const Poly& o,long x){
assert(o.len<=len);
RNG(i,0,o.len) addto(A[i],o.A[i]*x);
}
void substitute(long* f)const{
RNG(i,0,len){
RNG(j,0,i) addto(f[j],C(i,j)*A[i]);
}
}
void dbg(){
RNG(i,0,len) cerr<<A[i]<<" ";
cerr<<"\n";
}
};
Poly F[MAXN],H[MAXN];
int main(){
#if defined(_LOCAL_)
freopen("in","r",stdin);
freopen("out","w",stdout);
// freopen("/dev/null","w",stderr);
#else
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
#endif
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n;
RNG(_,1,n-1,u,v) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
fac[0]=1; RNG(i,1,n) fac[i]=fac[i-1]*i%MOD;
inv[n]=qpow(fac[n],MOD-2); IRNG(i,n-1,0) inv[i]=inv[i+1]*(i+1)%MOD;
int rt;
{ pii x{INF,0}; dfs1(1,0,x); rt=x.sec; }
dfs2(rt,0);
RNG(u,1,n){
if(u==rt) continue;
RNG(i,1,siz[u]) addto(ans[i],siz[u]*C(siz[u]-1,i-1));
}
vector<int> tmp;
F[rt].init(siz[rt]),F[rt].A[0]=1,F[rt].upd1(siz[rt]),H[rt].init(siz[rt]);
for(int u:G[rt]) F[u].init(siz[u]),F[u].A[0]=1,F[u].upd1(siz[u]),H[u].init(siz[u]);
RNG(i,1,n){
vector<int> tmp2;
for(int u:tmp){
if(siz[fa[u]]<i){
F[rt].upd2(-siz[u]),F[rt].upd1(siz[u]);
F[bel[u]].upd2(-siz[u]),F[bel[u]].upd1(siz[u]);
}else tmp2.push_back(u);
}
for(int u:vec[i-1]){
F[rt].upd1(-siz[u]),F[rt].upd2(siz[u]);
F[bel[u]].upd1(-siz[u]),F[bel[u]].upd2(siz[u]);
tmp2.push_back(u);
}
tmp=move(tmp2);
H[rt].add(F[rt],1);
for(int u:G[rt]) H[u].add(F[u],1);
cerr<<i<<"\n";
F[rt].dbg();
for(int u:G[rt]) F[u].dbg();
}
H[rt].dbg();
for(int u:G[rt]) H[u].dbg();
for(int u:G[rt]) H[rt].add(H[u],MOD-1);
H[rt].dbg();
H[rt].substitute(ans);
RNG(i,1,n) cerr<<ans[i]<<" ";
cerr<<"\n";
RNG(i,1,n) ans[i]=ans[i]*qpow(C(n,i),MOD-2)%MOD;
RNG(i,1,n) cout<<ans[i]<<"\n";
}