#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int head[200005],t1,t2;
struct edge{
    int v,nxt;
}e[400005];
ll n,ans[200005],f[200005],g[200005],tot,md,pre[200005],suf[200005],ed[200005];
void addedge(int fr,int to){
    e[++tot].nxt=head[fr];
    e[tot].v=to;
    head[fr]=tot;
}
void dfs1(int root,int fa)
{
    f[root]++;int tot=0;
    for(int i=head[root];i;i=e[i].nxt)
    {
        if(e[i].v==fa) continue;
        dfs1(e[i].v,root);
        f[root]=f[root]*f[e[i].v]%md;
    }
    for(int i=head[root];i;i=e[i].nxt) if(e[i].v!=fa) ed[++tot]=e[i].v;
    f[root]++;f[root]%=md;pre[0]=suf[tot+1]=1;
    for(int i=1;i<=tot;i++) pre[i]=pre[i-1]*f[ed[i]]%md;
    for(int i=tot;i;i--) suf[i]=suf[i+1]*f[ed[i]]%md;
    for(int i=1;i<=tot;i++) g[ed[i]]=pre[i-1]*suf[i+1]%md;
}
void dfs2(int root,int fa){
    if(root==1) ans[root]=1;
    else ans[root]=(g[root]*ans[fa]+1)%md;
    for(int i=head[root];i;i=e[i].nxt) if(e[i].v!=fa) dfs2(e[i].v,root);
}
int main()
{
    scanf("%lld%lld",&n,&md);
    for(int i=1;i<n;i++) scanf("%d%d",&t1,&t2),addedge(t1,t2),addedge(t2,t1);
    dfs1(1,1);dfs2(1,1);
    for(int i=1;i<=n;i++) printf("%lld\n",ans[i]*(md+f[i]-1)%md);
    return 0;
}