#include <bits/stdc++.h>
using namespace std;
namespace thecold {
inline int read() {
  int res = 0;
  bool flag = false;
  char c = getchar();
  while (!isdigit(c)) flag = (c == '-'), c = getchar();
  while (isdigit(c)) res = res * 10 + (c ^ 48), c = getchar();
  return !flag ? res : -res;
}
const int Max_n = 2e3 + 5;
struct node {
  int nex, to;
  node(int a, int b) { nex = a, to = b; }
  node() {}
} edge[Max_n << 1];
int head[Max_n], n, tot;
inline void add_edge(const int x, const int y) {
  edge[++tot] = node(head[x], y), head[x] = tot;
  edge[++tot] = node(head[y], x), head[y] = tot;
}
const int jzp = 1e9 + 7;
inline void ADD(int &x, const int y) {
  x += y;
  if (x >= jzp) x -= jzp;
}
inline int add(const int x, const int y) {
  int ret = x + y;
  if (ret >= jzp) ret -= jzp;
  return ret;
}
int f[Max_n][Max_n][2], bel[Max_n][2], siz[Max_n];
void dfs_tree(const int now, const int from) {
  f[now][1][0] = f[now][1][1] = 1;
  siz[now] = 1;
  for (int i = head[now]; i; i = edge[i].nex) {
    int nex = edge[i].to;
    if (nex == from) continue;
    dfs_tree(nex, now);
    memset(bel, 0, sizeof(bel));
    for (int j = 1; j <= siz[now]; ++j)
      for (int k = 1; k <= siz[nex]; ++k) {
        ADD(bel[j + k][0], 1ll * f[now][j][0] * f[nex][k][1] % jzp);
        ADD(bel[j + k][1], 1ll * f[now][j][1] * f[nex][k][1] % jzp);
        ADD(bel[j + k - 1][0], 1ll * f[now][j][0] * f[nex][k][0] % jzp);
        ADD(bel[j + k - 1][1], 1ll * f[now][j][1] * f[nex][k][0] % jzp);
        ADD(bel[j + k - 1][1], 1ll * f[now][j][0] * f[nex][k][1] % jzp);
      }
    memcpy(f[now], bel, sizeof(bel));
    siz[now] += siz[nex];
  }
}
int g[Max_n], h[Max_n], jc[Max_n], invjc[Max_n];
inline int quickpow(long long x, long long y) {
  long long ret = 1;
  while (y) {
    if (y & 1) ret = ret * x % jzp;
    x = x * x % jzp, y >>= 1;
  }
  return ret;
}
inline int C(const int n, const int m) {
  if (m > n) return 0;
  return 1ll * jc[n] * invjc[m] % jzp * invjc[n - m] % jzp;
}
inline void main() {
  n = read();
  for (int i = 1; i < n; ++i) add_edge(read(), read());
  dfs_tree(1, 0);
  jc[0] = invjc[0] = 1;
  for (int i = 1; i <= n; ++i) jc[i] = 1ll * jc[i - 1] * i % jzp;
  invjc[n] = quickpow(jc[n], jzp - 2);
  for (int i = n - 1; i; --i) invjc[i] = 1ll * invjc[i + 1] * (i + 1) % jzp;
  int mi = 1;
  g[n - 1] = 1;
  for (int i = 2; i <= n; ++i)
    g[n - i] = 1ll * f[1][i][1] * mi % jzp, mi = 1ll * mi * n % jzp;
  for (int k = 0; k < n; ++k) {
    int ans = 0;
    for (int i = k; i <= n; ++i)
      if ((i - k) & 1)
        ADD(ans, jzp - 1ll * C(i, k) * g[i] % jzp);
      else
        ADD(ans, 1ll * C(i, k) * g[i] % jzp);
    printf("%d ", ans);
  }
}
}  // namespace thecold
int main() {
  thecold::main();
  return 0;
}
