rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 18
int n,m,a[N][N],vis[N],u,v,ans,flag,now,dp[N][N],cnt;
vector<int> g[N];
void finddp(int x,int from){
for(int j=0;j<g[x].size();j++){
if(g[x][j]!=from){
finddp(g[x][j],x);
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
continue;
}
flag=1;
for(int j=0;j<g[x].size();j++){
if(g[x][j]==from){
continue;
}
now=0;
for(int k=1;k<=n;k++){
if(a[i][k]){
now+=dp[g[x][j]][k];
}
}
flag*=now;
}
dp[x][i]=flag;
}
return ;
}
void dfs(int pos){
if(pos==n+1){
memset(dp,0,sizeof(dp));
finddp(1,0);
for(int i=1;i<=n;i++){
if(n%2==cnt%2){
ans+=dp[1][i];
}
else{
ans-=dp[1][i];
}
}
return ;
}
cnt++;
vis[pos]=1;
dfs(pos+1);
cnt--;
vis[pos]=0;
dfs(pos+1);
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n-1;i++){
cin>>u>>v;
a[u][v]=1;
a[v][u]=1;
}
for(int i=1;i<=n-1;i++){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1);
cout<<ans<<endl;
return 0;
}