#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int n, u, v;
long long down[100007], up[100007], ans[100007], mod, suf[100007], pref[100007];
vector <int> edge[100007];

void dfsdown(int u, int par){
	down[u] = 1;
	for(int v : edge[u]){
		if(v == par) continue;
		dfsdown(v, u);
		down[u] = (down[u] * (down[v] + 1)) % mod;
	}
	ans[u] = down[u];
}

void dfsup(int u, int par){
	pref[0] = 1;
	for(int i = 0; i < (int)edge[u].size(); i++){
		int v = edge[u][i];
		pref[i + 1] = pref[i];
		if(v == par) continue;
		pref[i + 1] = (pref[i + 1] * (down[v] + 1)) % mod;
	}
	suf[(int)edge[u].size() + 1] = 1;
	for(int i = (int)edge[u].size() - 1; i >= 0; i--){
		int v = edge[u][i];
		suf[i + 1] = suf[i + 2];
		if(v == par) continue;
		suf[i + 1] = (suf[i + 1] * (down[v] + 1)) % mod;
	}
	for(int i = 0; i < (int)edge[u].size(); i++){
		int v = edge[u][i];
		if(v == par) continue;
		up[v] = pref[i] * suf[i + 2] % mod * (up[u] + 1) % mod;
		down[v] = down[v] * (up[v] + 1) % mod;
	}
	for(int v : edge[u]){
		if(v == par) continue;
		dfsup(v, u);
	}
}

signed main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> n >> mod;
	for(int i = 1; i < n; i++){
		cin >> u >> v;
		edge[u].pb(v);
		edge[v].pb(u);
	}
	dfsdown(1, 1);
	up[1] = 0;
	dfsup(1, 1);
	for(int i = 1; i <= n; i++) cout << down[i] << "\n";
}
