#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N=2005;
int n,m,fa[N][N],pos[N][N],ans;
vector<int>E[N];
void dfs(int u,int f,int *ff){
	ff[u]=f;
	for(int v:E[u])
		if(v!=f)
			dfs(v,u,ff);
}
void add(int x,int y){
	if(x==y||pos[x][y]==y||pos[y][x]==x)return;
	if(pos[x][y]!=-1)add(pos[x][y],y);
	else if(pos[y][x]!=-1)add(pos[y][x],x);
	else{
		pos[x][y]=y;pos[y][x]=x;queue<int>Q;
		Q.push(y);
		while(!Q.empty()){
			int u=Q.front();Q.pop();
			for(int v:E[u])
				if(v!=fa[x][u])
					if(pos[x][v]!=-1)
						add(y,v);
					else pos[x][v]=y,Q.push(v);
		}
		Q.push(x);
		while(!Q.empty()){
			int u=Q.front();Q.pop();
			for(int v:E[u])
				if(v!=fa[y][u])
					if(pos[y][v]!=-1)
						add(x,v);
					else pos[y][v]=x,Q.push(v);
		}
	}
}
void dfs2(int u,int f,int las){
	if(pos[las][u]==u)++ans,las=u;
	for(int v:E[u])
		if(v!=f)
			dfs2(v,u,las);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,x,y;i<n;++i){
		scanf("%d%d",&x,&y);
		E[x].push_back(y);E[y].push_back(x);
	}
	for(int i=1;i<=n;++i)dfs(i,0,fa[i]);
	memset(pos,-1,sizeof(pos));
	for(int i=1,x,y;i<=m;++i){
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	for(int i=1;i<=n;++i)dfs2(i,0,i);
	printf("%d\n",ans>>1);
	return 0;
}
