#![allow(non_snake_case, unused_imports)]
//////////////////////////////// LIBRARY START ////////////////////////////////
#[macro_use]
pub mod contest {
    #[macro_use]
    pub mod math {
        //! math library.

        use std::ops::*;

        static mut MODULO: i64 = 1_000_000_007;

        #[inline]
        fn modulo() -> i64 {
            unsafe { MODULO }
        }

        #[derive(Copy, Clone)]
        pub struct Mint(pub i64);

        impl Mint {
            pub fn set_mod(modulo: i32) {
                unsafe {
                    MODULO = modulo as i64;
                }
            }
            pub fn value(self) -> i64 {
                self.0
            }
        }

        impl ::std::fmt::Display for Mint {
            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
                write!(f, "{}", self.0)
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// assert_eq!(1, (Mint(2) + Mint(4)).0);
        /// ```
        impl<I: ToI64> Add<I> for Mint {
            type Output = Mint;
            fn add(self, o: I) -> Mint {
                let mut x = self.0 + o.to_i64();
                if x >= modulo() {
                    x -= modulo();
                }
                Mint(x)
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// let mut a = Mint(2);
        /// a += Mint(4);
        /// assert_eq!(1, a.0);
        /// ```
        impl<I: ToI64> AddAssign<I> for Mint {
            fn add_assign(&mut self, o: I) {
                let mut x = self.0 + o.to_i64();
                if x >= modulo() {
                    x -= modulo();
                }
                self.0 = x;
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// assert_eq!(4, (Mint(2) - Mint(3)).0);
        /// ```
        impl<I: ToI64> Sub<I> for Mint {
            type Output = Mint;
            fn sub(self, o: I) -> Mint {
                let mut x = self.0 - o.to_i64();
                if x < 0 {
                    x += modulo();
                }
                Mint(x)
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// let mut a = Mint(2);
        /// a -= Mint(4);
        /// assert_eq!(3, a.0);
        /// ```
        impl<I: ToI64> SubAssign<I> for Mint {
            fn sub_assign(&mut self, o: I) {
                let mut x = self.0 - o.to_i64();
                if x < modulo() {
                    x += modulo();
                }
                self.0 = x;
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// assert_eq!(1, (Mint(2) * Mint(3)).0);
        /// ```
        impl<I: ToI64> Mul<I> for Mint {
            type Output = Mint;
            fn mul(self, o: I) -> Mint {
                let x = (self.0 * o.to_i64()) % modulo();
                Mint(x)
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// let mut a = Mint(2);
        /// a *= Mint(4);
        /// assert_eq!(3, a.0);
        /// ```
        impl<I: ToI64> MulAssign<I> for Mint {
            fn mul_assign(&mut self, o: I) {
                let x = (self.0 * o.to_i64()) % modulo();
                self.0 = x;
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// assert_eq!(4, (Mint(2) / Mint(3)).0);
        /// ```
        impl<I: ToI64> Div<I> for Mint {
            type Output = Mint;
            fn div(self, o: I) -> Mint {
                let x = self.0 * inv(o.to_i64(), modulo()) % modulo();
                Mint(x)
            }
        }

        /// ```
        /// use contest::math::Mint;
        /// Mint::set_mod(5);
        /// let mut a = Mint(2);
        /// a /= Mint(4);
        /// assert_eq!(3, a.0);
        /// ```
        impl<I: ToI64> DivAssign<I> for Mint {
            fn div_assign(&mut self, o: I) {
                let x = self.0 * inv(o.to_i64(), modulo()) % modulo();
                self.0 = x;
            }
        }

        impl Mint {
            pub fn inv(self) -> Mint {
                Mint(self::inv(self.0, modulo()))
            }
        }

        pub trait ToI64 {
            fn to_i64(self) -> i64;
        }
        impl ToI64 for i32 {
            #[inline]
            fn to_i64(self) -> i64 {
                self as i64
            }
        }
        impl ToI64 for i64 {
            #[inline]
            fn to_i64(self) -> i64 {
                self
            }
        }
        impl ToI64 for Mint {
            #[inline]
            fn to_i64(self) -> i64 {
                self.0
            }
        }

        /// ```
        /// use contest::math;
        /// assert_eq!(3, math::inv(2,5));
        /// assert_eq!(1, math::inv(1,2));
        /// assert_eq!(1, math::inv(3,2));
        /// ```
        pub fn inv(value: i64, modulo_prime: i64) -> i64 {
            return pow_mod(value, modulo_prime - 2, modulo_prime);
        }

        /// ```
        /// use contest::math;
        /// assert_eq!(8, math::pow_mod(2,3,10));
        /// assert_eq!(1, math::pow_mod(3,4,10));
        /// assert_eq!(1, math::pow_mod(0,0,3));
        /// assert_eq!(0, math::pow_mod(0,0,1));
        /// ```
        pub fn pow_mod(value: i64, exponent: i64, modulo: i64) -> i64 {
            if exponent < 0 {
                panic!("Exponent should >= 0.");
            }
            if modulo == 1 {
                return 0;
            }
            let modulo = modulo;
            let mut value = value;
            if value >= modulo {
                value %= modulo;
            }
            if value < 0 {
                value = value % modulo + value;
            }
            let mut res = 1;
            let mut exponent = exponent;
            while exponent > 0 {
                if (exponent & 1) == 1 {
                    res = res * value % modulo;
                }
                value = value * value % modulo;
                exponent >>= 1;
            }
            res
        }
    }
    #[macro_use]
    pub mod prelude {
        pub use self::myvec::*;
        #[macro_use]
        pub mod primitive {
            pub trait ToUsize: Sized {
                fn to_usize(self) -> usize;
            }

            impl ToUsize for i32 {
                #[inline]
                fn to_usize(self) -> usize {
                    self as usize
                }
            }

            impl ToUsize for i64 {
                #[inline]
                fn to_usize(self) -> usize {
                    self as usize
                }
            }

            impl ToUsize for usize {
                #[inline]
                fn to_usize(self) -> usize {
                    self
                }
            }

        }
        #[macro_use]
        pub mod myvec {
            use std::fmt;
            use std::iter::FromIterator;
            use std::ops::*;

            pub use super::primitive::ToUsize;

            /// `Vec` indexable with `i32`, `i64` or `usize`.
            #[derive(Clone, Debug, PartialEq, PartialOrd)]
            pub struct MyVec<T>(pub Vec<T>);

            /// Creates `MyVec`
            #[macro_export]
            macro_rules! v {
    ( $( $x:expr ),* ) => {
        MyVec(vec![ $( $x, )* ])
    };
    ( $x:expr ; $n:expr ) => {
        {
            MyVec(vec![$x; $n as usize])
        }
    };
}

            impl<T: fmt::Display> fmt::Display for MyVec<T> {
                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
                    let n = self.len();
                    for i in 0..n {
                        let r = if i < n - 1 {
                            writeln!(f, "{}", self.0[i])
                        } else {
                            write!(f, "{}", self.0[i])
                        };
                        if r.is_err() {
                            return r;
                        }
                    }
                    Ok(())
                }
            }

            impl<T> Deref for MyVec<T> {
                type Target = Vec<T>;

                #[inline]
                fn deref(&self) -> &Vec<T> {
                    &self.0
                }
            }

            impl<T> DerefMut for MyVec<T> {
                #[inline]
                fn deref_mut(&mut self) -> &mut Vec<T> {
                    &mut self.0
                }
            }

            impl<T> FromIterator<T> for MyVec<T> {
                #[inline]
                fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
                    MyVec(Vec::from_iter(iter))
                }
            }

            impl<T, I: ToUsize> Index<I> for MyVec<T> {
                type Output = T;

                #[inline]
                fn index(&self, i: I) -> &T {
                    &self.0[i.to_usize()]
                }
            }

            impl<T, I: ToUsize> IndexMut<I> for MyVec<T> {
                #[inline]
                fn index_mut(&mut self, i: I) -> &mut T {
                    &mut self.0[i.to_usize()]
                }
            }

            #[test]
            fn test_myvec() {
                let mut x = v![3, 2, 1];
                x.sort();
                assert_eq!(vec![1, 2, 3], *x);
                let i = 1i32;
                assert_eq!(2, x[i]);
                x[i] = 3;
                assert_eq!(3, x[i]);
                let u = 1usize;
                assert_eq!(3, x[u]);
                x[u] = 2;
                assert_eq!(2, x[u]);
                assert_eq!(2, x[1]);

                assert_eq!("MyVec([1, 2, 3])", format!("{:?}", x));
                assert_eq!(v![1, 2, 3], x);

                assert_eq!("1\n2\n3", format!("{}", x));

                let mut y = v![v![1, 2]; 3];
                y[0][0] = 2;
                assert_eq!(vec![2, 2], *y[0]);
                assert_eq!(vec![1, 2], *y[1]);
            }
        }
    }
    #[macro_use]
    pub mod io {
        /// Scanner
        ///
        /// # Example
        /// ```
        /// use contest::io::Scanner;
        /// let mut sc = Scanner::new("1 2 \n\n \r\t \n 3".as_bytes());
        /// assert_eq!("1".to_string(), sc.next::<String>());
        /// let v = sc.nexts(2);
        /// assert_eq!(2i32, v[0]);
        /// assert_eq!(3i32, v[1]);
        ///
        /// // To create a scanner from stdin:
        /// Scanner::new(std::io::stdin());
        /// ```
        use std;
        use std::io;
        use std::io::BufRead;

        use super::prelude::MyVec;

        pub struct Scanner<R: io::Read> {
            br: io::BufReader<R>,
            // Read tokens are stored in reversed order per line.
            buf: Vec<String>,
        }

        pub fn new<R: io::Read>(r: R) -> Scanner<R> {
            Scanner::new(r)
        }

        impl<R: io::Read> Scanner<R> {
            #[inline]
            pub fn new(r: R) -> Scanner<R> {
                Scanner {
                    br: io::BufReader::new(r),
                    buf: vec![],
                }
            }
            #[inline]
            pub fn next<T>(&mut self) -> T
            where
                T: std::str::FromStr,
                T::Err: std::fmt::Debug,
            {
                self.next_string()
                    .map(|s| s.parse::<T>().expect("Parse failed: "))
                    .expect("Unexpected EOF")
            }
            #[inline]
            pub fn nexts<T>(&mut self, n: i32) -> MyVec<T>
            where
                T: std::str::FromStr,
                T::Err: std::fmt::Debug,
            {
                let mut res = v![];
                for _ in 0..n {
                    res.push(self.next());
                }
                res
            }
            fn next_string(&mut self) -> Option<String> {
                self.buf.pop().or_else(|| match self.update() {
                    true => self.next_string(),
                    false => None,
                })
            }
            #[inline]
            fn update(&mut self) -> bool {
                let mut s = String::new();
                let res = self.br.read_line(&mut s);
                match res.expect("I/O error.") {
                    0 => false,
                    _ => {
                        self.buf = s.split_whitespace().map(|x| x.to_string()).rev().collect();
                        true
                    }
                }
            }
        }

        #[test]
        fn test_next() {
            let mut sc = new("hoge".as_bytes());
            let s: String = sc.next();
            assert_eq!("hoge", s);
        }
    }
}
//////////////////////////////// LIBRARY END ////////////////////////////////

use contest::io::Scanner;
use contest::math::Mint;
use contest::prelude::MyVec;

fn main() {
    let mut sc = Scanner::new(std::io::stdin());
    let n = sc.next::<i32>();
    let k = sc.next::<i32>();
    let mut g = v![v![]; n];
    for _ in 0..n - 1 {
        let a = sc.next::<i32>() - 1;
        let b = sc.next::<i32>() - 1;
        g[a].push(b);
        g[b].push(a);
    }
    Mint::set_mod(1_000_000_007);
    let res = recur(&g, 0, -1, k) * k;
    println!("{}", res);
}

fn recur(g: &MyVec<MyVec<i32>>, c: i32, p: i32, k: i32) -> Mint {
    let mut res = Mint(1);
    let mut cnt = 0;
    if p >= 0 {
        cnt += 1;
    }
    for i in g[c].iter() {
        if *i == p {
            continue;
        }
        cnt += 1;
        let d = k - cnt;
        if d < 0 {
            return Mint(0);
        }
        res *= d;
        res *= recur(g, *i, c, k);
    }
    res
}


Measured memory_bytes: 14204