#include #include #include #include #include #include using namespace std ; typedef long long LL ; #define clr( a , x ) memset ( a , x , sizeof a ) const int MAXN = 2200 ; const int mod = 1e9 + 7 ; const LL v2 = ( mod + 1 ) / 2 ; vector < int > G[MAXN] ; int a[MAXN] ; LL x[MAXN][MAXN] ; LL nxt[MAXN] ; LL res[MAXN] ; int n , m ; void fwt ( LL a[] , int n ) { for ( int d = 1 ; d < n ; d <<= 1 ) { for ( int m = d << 1 , i = 0 ; i < n ; i += m ) { for ( int j = 0 ; j < d ; ++ j ) { LL x = a[i + j] ; LL y = a[i + j + d] ; a[i + j] = ( x + y ) % mod ; a[i + j + d] = ( x - y + mod ) % mod ; } } } } void ufwt ( LL a[] , int n ) { for ( int d = 1 ; d < n ; d <<= 1 ) { for ( int m = d << 1 , i = 0 ; i < n ; i += m ) { for ( int j = 0 ; j < d ; ++ j ) { LL x = a[i + j] ; LL y = a[i + j + d] ; a[i + j] = 1LL * ( x + y ) * v2 % mod ; a[i + j + d] = 1LL * ( x - y + mod ) * v2 % mod ; } } } } void dfs ( int u , int f ) { for ( int i = 0 ; i < m ; ++ i ) { x[u][i] = 0 ; } x[u][0] = 1 ; fwt ( x[u] , m ) ; for ( int i = 0 ; i < G[u].size () ; ++ i ) { int v = G[u][i] ; if ( v == f ) continue ; dfs ( v , u ) ; fwt ( x[v] , m ) ; for ( int j = 0 ; j < m ; ++ j ) { x[u][j] = 1LL * x[u][j] * x[v][j] % mod ; } } ufwt ( x[u] , m ) ; for ( int i = 0 ; i < m ; ++ i ) { res[i ^ a[u]] = ( res[i ^ a[u]] + x[u][i] ) % mod ; nxt[i] = x[u][i ^ a[u]] ; } //printf ( "%d :" , u ) ; for ( int i = 0 ; i < m ; ++ i ) { x[u][i] = nxt[i] ; // printf ( " %d" , x[u][i] ) ; } x[u][0] ++ ; x[u][0] %= mod ; //puts ( "" ) ; } void solve () { scanf ( "%d%d" , &n , &m ) ; for ( int i = 0 ; i < n ; ++ i ) { G[i].clear () ; scanf ( "%d" , &a[i] ) ; } for ( int i = 0 ; i < m ; ++ i ) { res[i] = 0 ; } for ( int i = 1 ; i < n ; ++ i ) { int u , v ; scanf ( "%d%d" , &u , &v ) ; -- u ; -- v ; G[u].push_back ( v ) ; G[v].push_back ( u ) ; } dfs ( 0 , 0 ) ; for ( int i = 0 ; i < m ; ++ i ) { printf ( "%I64d%c" , res[i] , i < m - 1 ? ' ' : '\n' ) ; } } int main () { int T ; scanf ( "%d" , &T ) ; for ( int i = 1 ; i <= T ; ++ i ) { solve () ; } return 0 ; }