#include<bits/stdc++.h>

using namespace std;

#define FOR(i, n) for(int i = 0; i < n; i++)

const int LOG = 25;

vector<vector<int>> adj;
vector<vector<int>> par;
vector<int> type; //0 - normal, 1 - parent/me, 2 - me
vector<int> dpth;
vector<vector<long long>> dp; //1 - musi byt

void pardfs(int a, int p, int d = 0){
	par[a][0] = p;
	dpth[a] = d;
	for(int b: adj[a]){
		if(b != p) pardfs(b, a, d + 1);
	}
}

int lca(int a, int b){
	if(dpth[a] < dpth[b]) swap(a, b);
	int d = dpth[a] - dpth[b];
	FOR(i, LOG){
		if(d & (1 << i)){
			a = par[a][i];
		}
	}
	if(a == b) return a;
	
	for(int i = LOG - 1; i >= 0; i--){
		if(par[a][i] != par[b][i]){
			a = par[a][i];
			b = par[b][i];
		}
	}
	return par[a][0];
}

void dpdfs(int a, int p){
	for(int b : adj[a]){
		if(b != p){
			dpdfs(b, a);
		}
	}

	// ak som zapnuty
	long long d = 1;
	for(int b : adj[a]){
		if(b == p) continue;
		d += min(dp[b][0], dp[b][1]);
	}

	// ak nie som
	long long d2 = INT_MAX;
	if(type[a] != 2){
		d2 = 0;
		for(int b : adj[a]){
			if(b == p) continue;
			d2 += dp[b][0];
		}
	}
	
	if(type[a] != 1){
		dp[a][0] = dp[a][1] = min(d, d2);
	}
	else{
		dp[a][0] = d;
		dp[a][1] = min(d, d2);
	}
}

int main(){
	int n,k;
	cin>>n>>k;

	adj.assign(n, {});
	par.assign(n, vector<int>(LOG));
	type.assign(n, 0);
	dp.assign(n, {INT_MAX, INT_MAX});
	dpth.assign(n, 0);

	for(int i=0; i<n-1; i++){
		int u, v;
		cin >> u >> v;

		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	pardfs(0, 0);
	FOR(i, LOG) FOR(a, n){
		par[a][i + 1] = par[par[a][i]][i];
	}
	

	FOR(_, k){
		int u,v;
		cin >> u >> v;

		int l = lca(u, v);
		if(dpth[u] < dpth[v]) swap(u, v);
		int dist = dpth[u] + dpth[v] - 2 * dpth[l];
		if(dist % 2){
			dist = dist / 2;
			FOR(i, LOG){
				if(dist & (1 << i)){
					u = par[u][i];
				}
			}
			type[u] = max(type[u], 1);
		}
		else{
			dist = dist / 2;
			FOR(i, LOG){
				if(dist & (1 << i)){
					u = par[u][i];
				}
			}
			type[u] = 2;
		}
	}

	dpdfs(0, 0);
	cout << min(dp[0][0], dp[0][1]) << "\n";
}
