#include<bits/stdc++.h>
using namespace std;
int n,m,st,c1[1<<18];
bool g[20][20],vis[20][20];
vector<int> son[20];
long long dp[20][20];
long long count(int rt,int fa,int to)
{
if(vis[rt][to])
return dp[rt][to];
vis[rt][to]=1;
long long res=1;
for(int x:son[rt])
{
if(x==fa)
continue;
long long tmp=0;
for(int i=1;i<=n;i++)
{
if((st&(1<<i)) && g[to][i])
tmp+=count(x,rt,i);
}
res*=tmp;
}
dp[rt][to]=res;
return res;
}
int main()
{
int u,v;
scanf("%d%d",&n,&m);
if(n&1)
c1[0]=-1;
else
c1[0]=1;
for(int i=1;i<(1<<n+1);i++)
if(i&1) c1[i]=-c1[i>>1];
else c1[i]=c1[i>>1];
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
g[u][v]=g[v][u]=1;
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
son[u].push_back(v);
son[v].push_back(u);
}
for(int i=1;i<=n;i++)
g[0][i]=1;
son[0].push_back(1);
long long ans=0;
for(st=0;st<(1<<n+1);st+=2)
{
memset(vis,0,sizeof vis);
ans+=c1[st]*count(0,0,0);
}
printf("%lld\n",ans);
return 0;
}