#include<bits/stdc++.h>
using namespace std;
int d[1000010],vis[1000010];
int depth[1000010];
int n,m,t,ans;
vector<int> ver[1000010];
int f[1000010][20];
queue<int> q;
void bfs(){
q.push(1),depth[1]=1;
while(q.size()){
int x=q.front();
q.pop();
for(int i=0;i<ver[x].size();i++){
int v=ver[x][i];
if(depth[v]) continue;
f[v][0]=x;
depth[v]=depth[x]+1;
for(int j=1;j<=t;j++){
f[v][j]=f[f[v][j-1]][j-1];
}
q.push(v);
}
}
}
int lca(int x,int y){
if(depth[x]>depth[y]) swap(x,y);
for(int i=t;i>=0;i--){
if(depth[f[y][i]]>=depth[x]) y=f[y][i];
}
if(x==y) return x;
for(int i=t;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i],y=f[y][i];
}
}
return f[x][0];
}
void solve(int x){
vis[x]=1;
for(int i=0;i<ver[x].size();i++){
int v=ver[x][i];
if(vis[v]) continue;
solve(v);
d[x]+=d[v];
}
if(x==1) return;
if(d[x]==0){
ans+=m;
}
if(d[x]==1){
ans+=1;
}
}
int main(){
cin>>n>>m;
t=(int)(log(n)/log(2))+1;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
ver[x].push_back(y);
ver[y].push_back(x);
}
bfs();
while(m--){
int a,b;
cin>>a>>b;
int LCA=lca(a,b);
d[LCA]-=2;
d[a]++;
d[b]++;
}
solve(1);
cout<<ans;
}
求调