#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ar array

const int mxN=100000;
int n, M, ans[mxN];
ll dp[mxN];
vector<int> adj[mxN];
vector<ll> pre[mxN], suf[mxN];

void dfs(int u=0) {
	dp[u]=1;
  	for (int v : adj[u]) {
		adj[v].erase(find(adj[v].begin(), adj[v].end(), u));
    	dfs(v);
    	dp[u]=dp[u]*(dp[v]+1)%M;
  	}
  	ll curp=1, curs=1;
  	for (int i=0; i<(int)adj[u].size(); ++i) {
    	int to=adj[u][i], rto=adj[u][(int)adj[u].size()-i-1];
    	pre[u].push_back(curp);
	    suf[u].push_back(curs);
    	curp=curp*(dp[to]+1)%M;
    	curs=curs*(dp[rto]+1)%M;
  	}
  	reverse(suf[u].begin(), suf[u].end());
}
 
void dfs2(int u=0, int par=-1) {
  	ans[u]=dp[u];
  	for (int i=0; i<(int)adj[u].size(); ++i) {
    	int to=adj[u][i], olds=dp[u], oldto=dp[to];
    	dp[u]=pre[u][i]*suf[u][i]%M;
    	if (par!=-1)
			dp[u]=dp[u]*(dp[par]+1)%M;

    	dp[to]=dp[to]*(dp[u]+1)%M;
    	dfs2(to, u);
    	dp[u]=olds;
    	dp[to]=oldto;
  	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> M;
	for (int i=1, u, v; i<n; ++i) {
		cin >> u >> v, --u, --v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	dfs();
	dfs2();
	for (int i=0; i<n; ++i)
		cout << ans[i] << '\n';
	return 0;
}

/* stuff you should look for
	* int overflow, array bounds
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
*/
