import sys,os,io

input = sys.stdin.readline

# input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline



N, M = map(int, input().split())

edge = [[] for _ in range(N)]

for i in range(N-1):

  a,b = list(map(int, input().split()))

  edge[a-1].append(b-1)

  edge[b-1].append(a-1)



def dfs(start):

  stack = [start]

  parent = [N]*N

  parent[start] = -1

  while stack:

    v = stack[-1]

    marker = 0

    for u in edge[v]:

      if u==parent[v]:

        continue

      if parent[u]==N: #子へ降ろす

        marker = 1

        parent[u]=v

        stack.append(u)

      else: #子から吸い上げる

        ans[v] *= ans[u]+1

        ans[v] %=M

    if marker==0:

      stack.pop()

  return



def dfs2(start):

  stack = [start]

  parent = [N]*N

  parent[start] = -1

  p_value = [0]*N

  while stack:

    v = stack.pop()

    cum1 = [1]*(len(edge[v])+1)

    cum2 = [1]*(len(edge[v])+1)

    for i,u in enumerate(edge[v]):

      if u==parent[v]:

        cum1[i+1] = cum1[i]*(p_value[v]+1)%M

      else:

        cum1[i+1] = cum1[i]*(ans[u]+1)%M

    for i,u in enumerate(edge[v][::-1]):

      if u==parent[v]:

        cum2[-i-2] = cum2[-i-1]*(p_value[v]+1)%M

      else:

        cum2[-i-2] = cum2[-i-1]*(ans[u]+1)%M

    for i,u in enumerate(edge[v]):

      if u==parent[v]:

        continue

      parent[u]=v

      p_value[u] = cum1[i]*cum2[i+1]%M

      ans[u] *= (p_value[u]+1)

      ans[u] %= M

      stack.append(u)

    ans[v] %= M

  return



ans = [1]*N

dfs(0)

dfs2(0)

print(*ans, sep='\n')

import sys,os,io

# input = sys.stdin.readline

input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline



N, M = map(int, input().split())

edge = [[] for _ in range(N)]

for i in range(N-1):

  a,b = list(map(int, input().split()))

  edge[a-1].append(b-1)

  edge[b-1].append(a-1)



def dfs(start):

  stack = [start]

  parent = [N]*N

  parent[start] = -1

  while stack:

    v = stack[-1]

    marker = 0

    for u in edge[v]:

      if u==parent[v]:

        continue

      if parent[u]==N: #子へ降ろす

        marker = 1

        parent[u]=v

        stack.append(u)

      else: #子から吸い上げる

        ans[v] *= ans[u]+1

        ans[v] %=M

    if marker==0:

      stack.pop()

  return



def dfs2(start):

  stack = [start]

  parent = [N]*N

  parent[start] = -1

  p_value = [0]*N

  while stack:

    v = stack.pop()

    cum1 = [1]*(len(edge[v])+1)

    cum2 = [1]*(len(edge[v])+1)

    for i,u in enumerate(edge[v]):

      if u==parent[v]:

        cum1[i+1] = cum1[i]*(p_value[v]+1)%M

      else:

        cum1[i+1] = cum1[i]*(ans[u]+1)%M

    for i,u in enumerate(edge[v][::-1]):

      if u==parent[v]:

        cum2[-i-2] = cum2[-i-1]*(p_value[v]+1)%M

      else:

        cum2[-i-2] = cum2[-i-1]*(ans[u]+1)%M

    for i,u in enumerate(edge[v]):

      if u==parent[v]:

        continue

      parent[u]=v

      p_value[u] = cum1[i]*cum2[i+1]%M

      ans[u] *= (p_value[u]+1)

      ans[u] %= M

      stack.append(u)

    ans[v] %= M

  return



ans = [1]*N

dfs(0)

dfs2(0)

print(*ans, sep='\n')

import sys, os, io

input = sys.stdin.readline
# input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline
N, M = map(int, input().split())
edge = [[] for _ in range(N)]
for i in range(N - 1):
    a, b = list(map(int, input().split()))
    edge[a - 1].append(b - 1)
    edge[b - 1].append(a - 1)


def dfs(start):
    stack = [start]
    parent = [N] * N
    parent[start] = -1
    while stack:
        v = stack[-1]
        marker = 0
        for u in edge[v]:
            if u == parent[v]:
                continue
            if parent[u] == N:  # 子へ降ろす
                marker = 1
                parent[u] = v
                stack.append(u)
            else:  # 子から吸い上げる
                ans[v] *= ans[u] + 1
                ans[v] %= M
        if marker == 0:
            stack.pop()
    return


def dfs2(start):
    stack = [start]
    parent = [N] * N
    parent[start] = -1
    p_value = [0] * N
    while stack:
        v = stack.pop()
        cum1 = [1] * (len(edge[v]) + 1)
        cum2 = [1] * (len(edge[v]) + 1)
        for i, u in enumerate(edge[v]):
            if u == parent[v]:
                cum1[i + 1] = cum1[i] * (p_value[v] + 1) % M
            else:
                cum1[i + 1] = cum1[i] * (ans[u] + 1) % M
        for i, u in enumerate(edge[v][::-1]):
            if u == parent[v]:
                cum2[-i - 2] = cum2[-i - 1] * (p_value[v] + 1) % M
            else:
                cum2[-i - 2] = cum2[-i - 1] * (ans[u] + 1) % M
        for i, u in enumerate(edge[v]):
            if u == parent[v]:
                continue
            parent[u] = v
            p_value[u] = cum1[i] * cum2[i + 1] % M
            ans[u] *= p_value[u] + 1
            ans[u] %= M
            stack.append(u)
        ans[v] %= M
    return


ans = [1] * N
dfs(0)
dfs2(0)
print(*ans, sep="\n")

import sys, os, io

# input = sys.stdin.readline
input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline
N, M = map(int, input().split())
edge = [[] for _ in range(N)]
for i in range(N - 1):
    a, b = list(map(int, input().split()))
    edge[a - 1].append(b - 1)
    edge[b - 1].append(a - 1)


def dfs(start):
    stack = [start]
    parent = [N] * N
    parent[start] = -1
    while stack:
        v = stack[-1]
        marker = 0
        for u in edge[v]:
            if u == parent[v]:
                continue
            if parent[u] == N:  # 子へ降ろす
                marker = 1
                parent[u] = v
                stack.append(u)
            else:  # 子から吸い上げる
                ans[v] *= ans[u] + 1
                ans[v] %= M
        if marker == 0:
            stack.pop()
    return


def dfs2(start):
    stack = [start]
    parent = [N] * N
    parent[start] = -1
    p_value = [0] * N
    while stack:
        v = stack.pop()
        cum1 = [1] * (len(edge[v]) + 1)
        cum2 = [1] * (len(edge[v]) + 1)
        for i, u in enumerate(edge[v]):
            if u == parent[v]:
                cum1[i + 1] = cum1[i] * (p_value[v] + 1) % M
            else:
                cum1[i + 1] = cum1[i] * (ans[u] + 1) % M
        for i, u in enumerate(edge[v][::-1]):
            if u == parent[v]:
                cum2[-i - 2] = cum2[-i - 1] * (p_value[v] + 1) % M
            else:
                cum2[-i - 2] = cum2[-i - 1] * (ans[u] + 1) % M
        for i, u in enumerate(edge[v]):
            if u == parent[v]:
                continue
            parent[u] = v
            p_value[u] = cum1[i] * cum2[i + 1] % M
            ans[u] *= p_value[u] + 1
            ans[u] %= M
            stack.append(u)
        ans[v] %= M
    return


ans = [1] * N
dfs(0)
dfs2(0)
print(*ans, sep="\n")

-input = sys.stdin.readline -# input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline +# input = sys.stdin.readline +input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline