#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;
}