#include<bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;
#define N 2200

int n,m,tot,x,y,head[N],f[N][N],ans,lca[N][N],q[N];
bool vis[N];
struct edge{int v,nxt;}e[N<<1];

void ins(int,int);

struct tree{
	int rt,fa[N],d[N];
	void dfs(int u){
		d[u]=d[fa[u]]+1;
		for (int i=head[u],v;i;i=e[i].nxt)
			if ((v=e[i].v)!=fa[u]){fa[v]=u; dfs(v);}
	}
	void cov(int o,vector<pii> &ed){
		int tt=0,ww=1; q[1]=o;
		f[rt][o]=o;
		while (tt<ww){
			int u=q[++tt];
			for (int i=head[u],v;i;i=e[i].nxt)
				if ((v=e[i].v)!=fa[u]){
					if (f[rt][v]){
						ed.emplace_back(o,f[rt][v]);
						f[rt][v]=o;
					}
					else{f[rt][v]=o; q[++ww]=v;}
				}
		}
	}
}T[N];

void add(int x,int y){
	e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;
}

void ins(int x,int y){
	if (x==y) return;
	if (f[x][y]==y) return;
	if (f[x][y]){ins(f[x][y],y); return;}
	if (f[y][x]){ins(f[y][x],x); return;}
	vector<pii> ed;
	T[x].cov(y,ed);
	T[y].cov(x,ed);
	for (auto i:ed) ins(i.first,i.second);
}

void getlca(int x,int y){
	if (lca[x][y]) return;
	if (x==y) lca[x][y]=x;
	else{
		if (T[1].d[x]<T[1].d[y]) swap(x,y);
		getlca(T[1].fa[x],y);
		lca[x][y]=lca[y][x]=lca[T[1].fa[x]][y];
	}
}

bool calclca(int x,int y,int z){
	int t=lca[x][y]^lca[y][z]^lca[z][x];
	return t==x||t==y||t==z;
}

void calc(int u,int o){
	vis[u]=1; ++ans;
	for (int i=head[u],v;i;i=e[i].nxt)
		if (!vis[v=e[i].v]&&calclca(u,o,v)) calc(v,u);
}

int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<n;++i){
		scanf("%d%d",&x,&y);
		add(x,y); add(y,x);
	}
	for (int i=1;i<=n;++i){T[i].rt=i; T[i].dfs(i);}
	for (int i=1;i<=n;++i)
		for (int j=1;j<=n;++j) getlca(i,j);
	for (int i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		ins(x,y);
	}
	memset(head,0,sizeof head); tot=0;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=n;++j)
			if (i!=j&&f[i][j]==j) add(i,j);
	for (int i=1;i<=n;++i){
		memset(vis,0,sizeof vis); calc(i,i);
	}
	printf("%d\n",(ans-n)/2);
	
	return 0;
}
			