//郑老师和na姐一样可爱^ ^
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define db double
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define PII pair<int,int>
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
vector<int>g[500010];
int n,m,depth[500010],fa[500010][21],dp[500010],ans;
void bfs(int x){
memset(depth,0x3f3f,sizeof depth);
queue<int>q;q.push(x);
depth[0]=0,depth[x]=1;
while(q.size()){
auto u=q.front();q.pop();
for(auto v:g[u]){
if(depth[v]>depth[u]+1){
depth[v]=depth[u]+1;
q.push(v);
fa[v][0]=u;
for(int k=1;k<=19;k++)fa[v][k]=fa[fa[v][k-1]][k-1];
}
}
}
}
int lca(int a,int b){
if(depth[a]>depth[b])swap(a,b);
for(int k=19;k>=0;k--)if(depth[fa[b][k]]>=depth[a])b=fa[b][k];
if(a==b)return a;
for(int k=19;k>=0;k--){
if(fa[a][k]!=fa[b][k]){
a=fa[a][k];
b=fa[b][k];
}
}
return fa[a][0];
}
int dis(int a, int b){
int c = lca(a, b);
return abs(depth[c]-depth[a]) + abs(depth[c]-depth[b]);
}
void dfs(int u){
for(auto v:g[u]){
if(depth[v]<depth[u])continue;
dfs(v);
dp[u]+=dp[v];
if(!dp[v])ans+=m;
else if(dp[v]==1)ans++;
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
bfs(1);
for(int i=0;i<m;i++){
int u,v;cin>>u>>v;
int f=lca(u,v);
dp[f]-=2;
dp[u]++,dp[v]++;
}
dfs(1);
cout<<ans<<endl;
}
signed main(){
fast
int t;t=1;//cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~