unittest
{
	assert( [ "4 3", "1 2", "2 3", "3 4" ].parse.expand.solve == 6 );
	assert( [ "5 4", "1 2", "1 3", "1 4", "4 5" ].parse.expand.solve == 48 );
	assert( [ "16 22", "12 1", "3 1", "4 16", "7 12", "6 2", "2 15", "5 16", "14 16", "10 11", "3 10", "3 13", "8 6", "16 8", "9 12", "4 3" ].parse.expand.solve == 271414432 );
}



import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nk = input.front.split.to!( long[] );
	auto abs = new long[ 2 ][ nk[ 0 ] - 1 ];
	foreach( ref ab; abs )
	{
		input.popFront;
		ab = input.front.split.to!( long[] );
		ab[] -= 1;
	}
	return tuple( nk[ 0 ], abs, nk[ 1 ] );
}

auto solve( long n, long[ 2 ][] abs, long k )
{
	auto us = new bool[ n ];
	auto nss = transformEtoN( n, abs );
	return k.mulMod( dfs( us, nss, k, 0, 0 ) );
}

long dfs( ref bool[] us, long[][] nss, long k, long i, long d )
{
	auto nn = nss[ i ].length.signed - ( 0 < d );		// 自分から一つ先のノードの数（根ノード以外は辿ってきたノードを含んでいるので-1する）
	auto nk = k - ( d < 2 );							// 自分から一つ先のノードが使える色数（一つ前と二つ前で使われた色は使えない）
	auto nd = d + 1;
	auto ct = nk.permutationMod( nn );
	us[ i ] = true;
	foreach( ni; nss[ i ] )
	{
		if( !us[ ni ] ) ct = ct.mulMod( dfs( us, nss, nk, ni, nd ) );
	}
	return ct;
}

// 辺配列を頂点配列に変換
auto transformEtoN( bool directed = false )( long n, long[ 2 ][] es )
{
	auto nss = new long[][ n ];
	foreach( e; es )
	{
		nss[ e[ 0 ] ] ~= e[ 1 ];
		static if( !directed ) nss[ e[ 1 ] ] ~= e[ 0 ];
	}
	return nss;
}

// 掛け算
auto mulMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y % MOD;
}

// 割り算
auto divMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y.powMod!MOD( MOD - 2 ) % MOD;
}

// べき乗
auto powMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	auto a = 1L;
	for( ; 0 < y; y >>= 1 )
	{
		if( y & 1 ) a = a * x % MOD;
		x = x ^^ 2 % MOD;
	}
	return a;
}

// 階乗
auto factorialMod( long MOD = 10L ^^ 9 + 7 )( long x )
{
	static memo = [ 1L ];
	if( memo.length <= x )
	{
		auto i = memo.length;
		memo.length = x + 1;
		for( ; i <= x; i++ ) memo[ i ] = memo[ i - 1 ] * i % MOD;
	}
	return memo[ x ];
}

// 順列数
auto permutationMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return ( x < y ) ? 0L : x.factorialMod!MOD.divMod!MOD( ( x - y ).factorialMod!MOD );
}
