#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse2")

    /*
    ||||||||||||||||||||||||||||||||||||||||||||||||
       |      |||         |      ||||    ||||  |   |
      | |     |   |      | |     |   |  |      |   |
     |   |    |    |    |   |    |   |  |      |   |
    |||||||   |    |   |||||||   |||     |||   |||||
    |     |   |   |    |     |   | |        |  |   |
    |     |   |||      |     |   |  ||  ||||   |   |
    ||||||||||||||||||||||||||||||||||||||||||||||||

    */
    using namespace std;
    //#include "testlib.h"
    #define ff first
    #define ss second
    #define mp make_pair
    #define all(v) v.begin(),v.end()
    #define int long long
    #define ll long long
    #define M 1000000007
    #define inputarr(a,n) for(int i=0;i<n;++i) cin>>a[i]
    #define GCD(m,n) __gcd(m,n)
    #define LCM(m,n) m*(n/GCD(m,n))
    #define mii  map<ll ,ll >
    #define msi  map<string,ll >
    #define mis  map<ll int, string>
    #define rep(a,b)    for(ll i=a;i<b;i++)
    #define rep0(n)    for(ll i=0;i<n;i++)
    #define repi(i,a,b) for(ll i=a;i<b;i++)
    #define pb push_back
    #define vi vector<ll>
    #define mp make_pair
    #define vs vector<string>
    #define ppb pop_back
    #define endl '\n'
    #define asdf ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define r0 return 0;
    #define FORD(i, a, b) for (int i = (int) (a); i >= (int) (b); --i)
    #define FORE(it, c) for (__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
    #define inputoutput freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
    #define input freopen("input.txt", "r", stdin);
    #define Set(a, s) 4(a, s, sizeof (a))
    #define FOR repi
    #define pii pair<int,int>
    //#define float long double
    ll max(ll a, ll b) { return (a > b)? a : b;}
    int min(int a, int b) { return (a < b)? a : b;}


     int solve()
     {
        int n,k;
        cin>>n>>k;
        vi graph[n+1];
        rep0(n-1){
            int a,b;
            cin>>a>>b;
            graph[a].pb(b);
            graph[b].pb(a);        
        }
        vi visited(n+1,0);
        vi height(n+1,0);
        #define top graph
        queue<int> q;
            q.push(1);

            visited[1]=k;
            while(!q.empty()) 
              { 
                int s = q.front(); 

                 q.pop(); 
                 int val=1;
                 if(height[s]>=1) val=2;
                 rep0(top[s].size())
                 {
                    if(visited[top[s][i]]) continue;
                    q.push(top[s][i]);
                    height[top[s][i]]=height[s]+1;
                    visited[top[s][i]]=k-val;
                    if(visited[top[s][i]]<=0) return cout<<0,0;
                    val++;
                 }
                  
              } 
              //rep(1,n+1) cout<<i<<" "<<visited[i]<<"\n";
              int ans=1;
              rep(1,n+1) ans=(ans*visited[i])%M;
              cout<<ans<<endl;
              //rep(1,n+1) {cout<<i<<":";FORE(it,graph[i]) cout<<*it<<" ";cout<<endl;}

        }
    signed main()
    {   
        asdf
        int t=1;
        //cin>>t;
        while(t--)
        {
            solve();
        }     
        
}

Measured memory_bytes: 8948