Problem:
Score : 100 points

Problem Statement

There is a tree with N vertices, numbered 1, 2, \ldots, N.
For each i (1 \leq i \leq N - 1), the i-th edge connects Vertex x_i and y_i.

Taro has decided to paint each vertex in white or black, so that any black vertex can be reached from any other black vertex by passing through only black vertices.

You are given a positive integer M.
For each v (1 \leq v \leq N), answer the following question:

Assuming that Vertex v has to be black, find the number of ways in which the vertices can be painted, modulo M.

Constraints

All values in input are integers.

1 \leq N \leq 10^5

2 \leq M \leq 10^9

1 \leq x_i, y_i \leq N

The given graph is a tree.

Input

Input is given from Standard Input in the following format:

N M
x_1 y_1
x_2 y_2
:
x_{N - 1} y_{N - 1}

Output

Print N lines.
The v-th (1 \leq v \leq N) line should contain the answer to the following question:

Assuming that Vertex v has to be black, find the number of ways in which the vertices can be painted, modulo M.

Sample Input 1

3 100
1 2
2 3

Sample Output 1

3
4
3

There are seven ways to paint the vertices, as shown in the figure below.
Among them, there are three ways such that Vertex 1 is black, four ways such that Vertex 2 is black and three ways such that Vertex 3 is black.

Sample Input 2

4 100
1 2
1 3
1 4

Sample Output 2

8
5
5
5

Sample Input 3

1 100

Sample Output 3

1

Sample Input 4

10 2
8 5
10 8
6 5
1 5
4 8
2 10
3 6
9 2
1 7

Sample Output 4

0
0
1
1
1
0
1
0
1
1

Be sure to print the answers modulo M.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System.Collections.Generic;
using System.IO;
using System.Linq;
using static System.Console;
class Z { static void Main() => new K(); }
class K
{
	int[] G => ReadLine().Split().Select(int.Parse).ToArray();
	public K()
	{
		SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
		Solve();
		Out.Flush();
	}
	int V, Mod;
	List<int>[] es;
	void Solve()
	{
		var I = G;
		V = I[0];
		Mod = I[1];
		es = new List<int>[V];
		for (var u = 0; u < V; u++) es[u] = new List<int>();
		for (var e = 0; e < V - 1; e++)
		{
			I = G;
			es[I[0] - 1].Add(I[1] - 1);
			es[I[1] - 1].Add(I[0] - 1);
		}
		// var par = DFS1Exe(0, -1);
		var dp0 = DFS2Exe(0, -1);
		var dp1 = DFS3Exe(0, dp0);
		for (var u = 0; u < V; u++) WriteLine(dp0[u] * (dp1[u] + 1) % Mod);
	}
	int[] DFS1Exe(int u, int p)
	{
		var par = new int[V];
		var st = new Stack<object>();
		st.Push(new A0 { u = u, p = p });
		while (st.Count > 0)
		{
			var f = st.Pop();
			if (f is A0)
			{
				var g = (A0)f;
				es[g.u].Remove(par[g.u] = g.p);
				st.Push(new A1 { u = g.u, p = g.p, i = 0 });
			}
			else
			{
				var g = (A1)f;
				if (g.i < es[g.u].Count)
				{
					st.Push(new A1 { u = g.u, p = g.p, i = g.i + 1 });
					st.Push(new A0 { u = es[g.u][g.i], p = g.u });
				}
			}
		}
		return par;
	}
	long[] DFS2Exe(int u, int p)
	{
		var dp0 = new long[V];
		var st = new Stack<object>();
		st.Push(new B0 { u = u, p = p });
		while (st.Count > 0)
		{
			var f = st.Pop();
			if (f is B0)
			{
				var g = (B0)f;
				dp0[g.u] = 1L;
				es[g.u].Remove(g.p);
				st.Push(new B1 { u = g.u, i = 0 });
			}
			else if (f is B1)
			{
				var g = (B1)f;
				if (g.i < es[g.u].Count)
				{
					st.Push(new B2 { u = g.u, p = g.p, i = g.i });
					st.Push(new B0 { u = es[g.u][g.i], p = g.u });
				}
			}
			else
			{
				var g = (B2)f;
				dp0[g.u] = dp0[g.u] * (dp0[es[g.u][g.i]] + 1) % Mod;
				st.Push(new B1 { u = g.u, p = g.p, i = g.i + 1 });
			}
		}
		return dp0;
	}
	long[] DFS3Exe(int u, long[] dp0)
	{
		var dp1 = new long[V];
		var st = new Stack<object>();
		st.Push(new C0 { u = u });
		while (st.Count > 0)
		{
			var f = st.Pop();
			if (f is C0)
			{
				var g = (C0)f;
				var W = es[g.u].Count;
				var x = new long[W + 1];
				var y = new long[W + 1];
				x[0] = y[W] = 1;
				for (var i = 0; i < W; i++) x[i + 1] = x[i] * (dp0[es[g.u][i]] + 1) % Mod;
				for (var i = W - 1; i >= 0; i--) y[i] = y[i + 1] * (dp0[es[g.u][i]] + 1) % Mod;
				for (var i = 0; i < W; i++) dp1[es[g.u][i]] = (dp1[g.u] + 1) * x[i] % Mod * y[i + 1] % Mod;
				x = y = null;
				st.Push(new C1 { u = g.u, i = 0 });
			}
			else
			{
				var g = (C1)f;
				if (g.i < es[g.u].Count)
				{
					st.Push(new C1 { u = g.u, i = g.i + 1 });
					st.Push(new C0 { u = es[g.u][g.i] });
				}
			}
		}
		return dp1;
	}
}
struct A0 { public int u, p; }
struct A1 { public int u, p, i; }
struct B0 { public int u, p; }
struct B1 { public int u, p, i; }
struct B2 { public int u, p, i; }
struct C0 { public int u; }
struct C1 { public int u, i; }