#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
queue<int>BFS;
vector<int>topo;
vector<int>adj[n + 1];
vector<int>par(n + 1);
vector<int>uadj[n + 1];
vector<int>dist(n + 1);
vector<bool>vis(n + 1);
vector<int>degree(n + 1);
vector<int64_t>pre[n + 1];
vector<int64_t>suf[n + 1];
pair<int, int>edges[n - 1];
vector<size_t>index(n + 1);
vector<int64_t>up(n + 1, 1);
vector<int64_t>down(n + 1, 1);
for (int i = 0; i < n - 1; ++i)
{
cin >> edges[i].first >> edges[i].second;
uadj[edges[i].first].push_back(edges[i].second);
uadj[edges[i].second].push_back(edges[i].first);
}
BFS.push(1);
dist[1] = 0;
while (!BFS.empty())
{
vis[BFS.front()] = true;
for (int& v: uadj[BFS.front()])
{
if (!vis[v])
{
BFS.push(v);
dist[v] = dist[BFS.front()] + 1;
}
}
BFS.pop();
}
for (int i = 0; i < n - 1; ++i)
{
if (dist[edges[i].first] > dist[edges[i].second])
{
swap(edges[i].first, edges[i].second);
}
}
for (int i = 0; i < n - 1; ++i)
{
adj[edges[i].first].push_back(edges[i].second);
par[edges[i].second] = edges[i].first;
++degree[edges[i].second];
}
BFS = queue<int>({ 1 });
while (!BFS.empty())
{
topo.push_back(BFS.front());
for (int& v: adj[BFS.front()])
{
if (--degree[v] == 0)
{
BFS.push(v);
}
}
BFS.pop();
}
reverse(topo.begin(), topo.end());
for (int& u: topo)
{
for (int& v: adj[u])
{
(down[u] *= down[v]) %= m;
}
++down[u] %= m;
}
for (int u = 1; u <= n; ++u)
{
int idx = 0;
for (int& v: adj[u])
{
index[v] = idx;
pre[u].push_back(down[v]);
suf[u].push_back(down[v]);
++idx;
}
}
for (int u = 1; u <= n; ++u)
{
if (!adj[u].empty())
{
for (int i = 1; i < pre[u].size(); ++i)
{
(pre[u][i] *= pre[u][i - 1]) %= m;
}
for (int i = suf[u].size() - 2; i >= 0; --i)
{
(suf[u][i] *= suf[u][i + 1]) %= m;
}
}
}
reverse(topo.begin(), topo.end());
for (int& v: topo)
{
if (par[v])
{
up[v] = up[par[v]];
if (index[v])
{
(up[v] *= pre[par[v]][index[v] - 1]) %= m;
}
if (index[v] < suf[par[v]].size() - 1)
{
(up[v] *= suf[par[v]][index[v] + 1]) %= m;
}
++up[v] %= m;
}
}
for (int i = 1; i <= n; ++i)
{
cout << (down[i] * up[i] - up[i] + m) % m << "\n";
}
return 0;
}