#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double
const int MAXN = 5e3;
const ll INF = 1e18;
const int MOD = 1e9 + 7;
const ld eps = 1e-6;
ll d[MAXN + 5];
struct DSU{
	ll N;
	vector<ll> par;
	DSU(ll _n){
		N = _n;
		par.resize(N + 5);
		for(int i = 1; i <= N; i++) par[i] = i;
	}
	ll find(ll idx){
		return (par[idx] == idx ? idx : par[idx] = find(par[idx]));
	}
	void join(ll a, ll b){
		a = find(a), b = find(b);
		if(a == b) return;
		par[b] = a;
	}
};
vector<pii> adj[MAXN + 5];
pii up[MAXN + 5];
ll dist[MAXN + 5];
void init(ll idx, ll par){
	for(auto [i, j] : adj[idx]){
		if(i != par){
			dist[i] = dist[idx] + 1;
			init(i, idx);
		}
	}
}
void dfs(ll idx, ll par){
	for(auto [i, j] : adj[idx]){
		if(i != par){
			up[i] = {idx, j};
			dfs(i, idx);
		}
	}
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);		
	int tc = 1;	
	// cin >> tc;
	for(;tc--;){
		ll N, M; cin >> N >> M;
		for(int i = 1; i < N; i++){
			d[i] = -1;
			ll u, v; cin >> u >> v;
			adj[u].push_back({v, i}), adj[v].push_back({u, i});
		}
		
		DSU dsu(N);
		init(1, -1);
		
		bool ok = 1;
		for(int i = 1; i <= M; i++){
			ll a, b; cin >> a >> b;
			dfs(a, -1);
			ll tmp = b;
			ll status = -1;
			while(tmp != a){
				if(d[up[tmp].sec] != -1){
					if(status != -1 && status != ((dist[tmp] < dist[up[tmp].fi]) ^ (d[up[tmp].sec]))){
						ok = 0;
						break;
					}
					status = ((dist[tmp] < dist[up[tmp].fi]) ^ (d[up[tmp].sec]));
				}
				tmp = up[tmp].fi;
			}
			if(status == -1) status = 0;
			tmp = b;
			ll last = -1;
			while(tmp != a){
				d[up[tmp].sec] = (status ^ (dist[tmp] < dist[up[tmp].fi]));
				if(last == -1) last = up[tmp].sec;
				else dsu.join(last, up[tmp].sec);
				tmp = up[tmp].fi;
			}
		}
		
		if(!ok){
			cout << 0 << "\n";
			continue;
		}
		
		ll ans = 1;
		for(int i = 1; i < N; i++){
			if(dsu.find(i) == i) ans = ans * 2LL % MOD;
		}
		cout << ans << "\n";
	}
}
/*
*/
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |