#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int,int> pii;
#define endl '\n'
#define F first
#define S second
const int MAX_N=1e5+5;

int n,m;
vector<int> G[MAX_N];
map<int,int> val[MAX_N];
ll tot[MAX_N];
ll ans[MAX_N];

void pre_calc(int now, int pa)
{
	tot[now]=1;
	for(auto &i:G[now])
	{
		if(i==pa) continue;
		pre_calc(i,now);
		tot[now]=(tot[now]*(tot[i]+1))%m;
	}
}
void old_update(int pre, int nxt)
{
	tot[pre]=1;
	for(auto &i:G[pre])
	{
		if(i==nxt) continue;
		tot[pre]=(tot[pre]*(tot[i]+1))%m;
	}
}
void update(int pre, int nxt)
{
	if(val[pre].empty())
	{
		vector<ll> l(1,1), r(1,1);
		for(int i=0;i<(int)G[pre].size()-1;i++)
			l.emplace_back(l.back()*(tot[G[pre][i]]+1)%m);
		for(int i=(int)G[pre].size()-1;i>0;i--)
			r.emplace_back(r.back()*(tot[G[pre][i]]+1)%m);
		reverse(r.begin(),r.end());
		for(int i=0;i<(int)G[pre].size();i++)
			val[pre][G[pre][i]]=l[i]*r[i]%m;
	}
	tot[pre]=val[pre][nxt];
}
void dfs(int now, int pa)
{
	ans[now]=1;
	for(auto &i:G[now])
		ans[now]=(ans[now]*(tot[i]+1))%m;
	for(auto &i:G[now])
	{
		if(i==pa) continue;
		update(now,i);
		dfs(i,now);
		update(i,now);
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,t1,t2;i<n;i++)
	{
		scanf("%d%d",&t1,&t2);
		G[t1].emplace_back(t2);
		G[t2].emplace_back(t1);
	}
	pre_calc(1,-1);
	dfs(1,-1);
	for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
	return 0;
}

