#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ui unsigned int
#define ull unsigned long long
#define db long double
#define pii pair<int,int>
#define pli pair<ll,int>
#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define vi vector<int>
#define vii vector<vi>
#define lb lower_bound
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,b,a) for(int i=(b);i>=(a);--i)
#define rep0(i,a,b) for(int i=(a);i<(b);++i)
#define fore(i,a) for(int i=0;i<a.size();++i)
#define gc() getchar()
#define ls x<<1,l,m
#define rs x<<1|1,m+1,r
inline ll rd()
{
	ll x=0,w=1;char c=gc();while(!isdigit(c)&&c!='-')c=gc();
	if(c=='-')c=gc(),w=-1;while(isdigit(c))x=x*10+c-48,c=gc();return x*w;
}
const int N=2005;
int n,m,S,T,ans,fa[N][N],vis[N][N];vi g[N];vector<pii>V;
void pre(int x,int o){for(int y:g[x])if(y!=fa[o][x])fa[o][y]=x,pre(y,o);}
void dfs(int x)
{
	vis[S][x]=T;
	for(int y:g[x])if(y!=fa[S][x])
	{
		if(vis[S][y])V.pb(mp(T,y));else dfs(y);
	}
}
void sol(int x,int p,int o)
{
	if(vis[o][x]==x)ans++,o=x;
	for(int y:g[x])if(y!=p)sol(y,x,o);
}
int main()
{
	n=rd();m=rd();
	rep(i,1,n-1){int u=rd(),v=rd();g[u].pb(v);g[v].pb(u);}
	rep(i,1,n)pre(i,i);
	rep(i,1,m)
	{
		int u=rd(),v=rd();V.pb(mp(u,v));
		while(!V.empty())
		{
			u=V.back().X;v=V.back().Y;V.pop_back();
			while(u!=v&&vis[u][v])u=vis[u][v];
			while(v!=u&&vis[v][u])v=vis[v][u];
			if(u==v)continue;
			S=u;T=v;dfs(T);S=v;T=u;dfs(T);
		}
	}
	rep(i,1,n)for(int j:g[i])sol(j,i,i);
	printf("%d\n",ans/2);return 0;
}
