//#include <bits/stdc++.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <cstdlib>
using namespace std;
#define forr(i,m,n) for (int i=(m); i<=(n); i++)
#define forv(i,m,n) for (int i=(m); i>=(n); i--)
#define forall(it,p) for (auto it = p.begin(); it != p.end(); ++it)
#define DBG 0
#define DBG2 0
#define R 1000000007

#define MAXN 100001
int a[MAXN];
int m;
vector< unordered_map<int, long> > dst(MAXN);

struct bar {
  int num;
  long prod1, prodall, prodme;
  bar() : num(0) {}
};

int main() {
  int n;
  cin >> n >> m;
  if (DBG) cout << "hello n " << n << " m " << m << endl;
  forr(i,1,n-1) {
    int x, y;
    cin >> x >> y;
    x--; y--;
    dst[x][y] = -1;
    dst[y][x] = -1;
    if (DBG) cout << "stop x " << x << " y " << y << endl;
  }
  if (DBG) {
    forr(i,0,n-1) {
      forall(it, dst[i])
        cout << it->first << " ";
      cout << endl;
    }
    cout << "missam" << endl;
  }
  if (DBG2) cout << "input done" << endl;
  if (n==1) { cout << 1; exit(0); }

  // 読み込み終了。まずリーフ側からルート方向へ辿る

  list<int> proc;
  list<int> nextproc;
  int dstn[MAXN];
  int root = -1;
  forr(i,0,n-1) {
    dstn[i] = dst[i].size();
    if (dstn[i] == 1)
      proc.push_back(i);
  }
  while (!proc.empty()) {
    forall(pnode, proc) {
      int node = *pnode;
      if (DBG) cout << "leaf->root node " << node << endl;
      int src = -1;
      long prod = 1;
      forall(it, dst[node]) {
        int dest = it->first;
        //if (dst[dest][node] == -1) {
        if (it->second == -1) {
          src = dest;
          continue;
        }
        prod = (prod * it->second) % m;
      }
      // ルートで最後に残るのは必ず1or2個。
      // 1個なら、外向きのキャッシュは全てできている
      if (src == -1) { root = node; break; }
      prod = (prod + 1) % m;
      dst[src][node] = prod;
      if (dstn[src] >= 2) {
        --dstn[src];
        if (dstn[src] == 1)
          nextproc.push_back(src);
      }
      if (DBG2) {
          cout << "node " << node << " done" << endl;
          forr(i,0,n-1) {
            cout << "i " << i << " ";
            forall(it, dst[i])
              cout << it->first << ":" << it->second << "  ";
            cout << endl;
          }
      }
    }
    if (DBG) cout << " sz " << proc.size()
                  << " sznx " << nextproc.size() << endl;

    // nextprocが空なら、今procにあるのがルート(1or2個)
    if (nextproc.empty())
      break;

    if (DBG) cout << "proc clr" << endl;
    proc.clear();
    forall(it, nextproc)
      proc.push_back(*it);
    nextproc.clear();
  }
  if (DBG2 && 0) {
    cout << "upto root done" << endl;
    forr(i,0,n-1) {
      cout << "i " << i << " ";
      forall(it, dst[i])
        cout << it->first << ":" << it->second << "  ";
      cout << endl;
    }
  }
  proc.clear();
  proc.push_back(root);

  // ルートからリーフへ向かう

  while (!proc.empty()) {
    forall(pnode, proc) {
      int node = *pnode;
      if (DBG) cout << "leaf<-root node " << node << endl;

      // 今見ているnodeは、外向きキャッシュは既にある前提
      // 周りのノードの値ごとにヒストグラムを作る
      unordered_map<long, bar> h;
      forall(it, dst[node]) {
        h[it->second].num++;
      }
      // 各値ごとに、その個数乗、およびその（個数ー１）乗を作る
      forall(it, h) {
        long p = 1;  // NOTE num==1のときprod1=0
        forr(i, 1, it->second.num-1)
          p = (p * it->first) % m;
        it->second.prod1 = p;
        //h[it->first].prod1 = p;
        it->second.prodall = (p * it->first) % m;
      }
      // 「周りの全部の積、ただし自分除く」を作る（キャッシュに入れる値）
      forall(it, h) {
        long p = 1;
        forall(it2, h)
          if (it->first == it2->first)
            p = (p * it2->second.prod1) % m;
          else
            p = (p * it2->second.prodall) % m;
        it->second.prodme = (p + 1) % m;
      }
      // 各ノードにヒストグラムの値をコピー
      forall(it, dst[node])
        if (dst[it->first][node] == -1) {
          dst[it->first][node] = h[it->second].prodme;
          nextproc.push_back(it->first);
        }
      if (DBG2) {
          cout << "node " << node << " done" << endl;
          forr(i,0,n-1) {
            cout << "i " << i << " ";
            forall(it, dst[i])
              cout << it->first << ":" << it->second << "  ";
            cout << endl;
          }
      }
    }
    if (DBG) cout << "proc clr" << endl;
    proc.clear();
    forall(it, nextproc)
      proc.push_back(*it);
    nextproc.clear();
  }
  if (DBG2) {
    cout << "down from root done" << endl;
    forr(i,0,n-1) {
      cout << "i " << i << " ";
      forall(it, dst[i])
        cout << it->first << ":" << it->second << "  ";
      cout << endl;
    }
  }

  if (DBG) cout << "loop foo call" << endl;
  forr(i,0,n-1) {
    long p = 1;
    forall(it, dst[i])
      p = (p * it->second) % m;
    cout << p << endl;
    //cout << foo(i, -1) << endl;
  }
}


Measured memory_bytes: 23716