# include <cstdio>
# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <list>
# include <queue>
# include <stack>
# include <cstring>
# include <string>
# include <cstdlib>
# include <cmath>
# include <algorithm>
using namespace std ;
const int mod = 1e9 + 7 ;
long long c [ 1100 ] [ 1100 ] ;
void getC ( )
{
for ( int i = 1 ; i <= 1000 ; i ++ )
c [ i ] [ 0 ] = 1 , c [ i ] [ i ] = 1 ;
for ( int j = 1 ; j <= 1000 ; j ++ )
{
for ( int i = j + 1 ; i <= 1000 ; i ++ )
c [ i ] [ j ] = ( c [ i - 1 ] [ j ] + c [ i - 1 ] [ j - 1 ] ) % mod ;
}
}
bool froot [ 1100 ] ;
struct Edge
{
int v , next ;
} edge [ 3000 ] ;
int head [ 1100 ] ;
int cnt ;
void addedge ( int u , int v )
{
edge [ cnt ] . v = v ;
edge [ cnt ] . next = head [ u ] ;
head [ u ] = cnt ++ ;
}
bool vis [ 1100 ] ;
int num [ 1100 ] ;
int getnum ( int u )
{
vis [ u ] = 1 ;
for ( int i = head [ u ] ; i != -1 ; i = edge [ i ] . next )
{
int v = edge [ i ] . v ;
if ( ! vis [ v ] )
{
num [ u ] += getnum ( v ) ;
}
}
return num [ u ] + 1 ;
}
long long per [ 1100 ] ;
long long dfs ( int u )
{
vis [ u ] = 1 ;
int sum = num [ u ] ;
for ( int i = head [ u ] ; i != -1 ; i = edge [ i ] . next )
{
int v = edge [ i ] . v ;
if ( ! vis [ v ] )
{
per [ u ] = ( ( per [ u ] * dfs ( v ) ) % mod * c [ sum ] [ num [ v ] + 1 ] ) % mod ;
sum = sum - num [ v ] - 1 ;
}
}
return per [ u ] ;
}
int main ( )
{
getC ( ) ;
int t ;
cin >> t ;
for ( int z = 1 ; z <= t ; z ++ )
{
cnt = 0 ;
memset ( head , -1 , sizeof ( head ) ) ;
memset ( froot , 0 , sizeof ( froot ) ) ;
memset ( vis , 0 , sizeof ( vis ) ) ;
memset ( num , 0 , sizeof ( num ) ) ;
int n ;
scanf ( "%d" , & n ) ;
for ( int i = 1 ; i < n ; i ++ )
{
int u , v ;
scanf ( "%d%d" , & u , & v ) ;
froot [ v ] = 1 ;
addedge ( u , v ) ;
}
int root = 0 ;
for ( int i = 1 ; i <= n ; i ++ )
if ( ! froot [ i ] )
{
root = i ;
break ;
}
getnum ( root ) ;
for ( int i = 1; i <= n ; i ++ )
per [ i ] = 1 ;
memset ( vis , 0 , sizeof ( vis ) ) ;
cout << "Case " << z << ": " ;
cout << dfs ( root ) << endl ;
}
}