#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int n,m,s=1;
int st[100010],ed[100010];
struct edge
{
int to,next,w;
} edge[100010],req[200010];
int head[50010],tot=1;
void add(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];head[u]=tot++;
}
int reqh[50010],reqt=1;
void addreq(int u,int v,int w)
{
req[reqt].to=v;req[reqt].w=w;
req[reqt].next=reqh[u];reqh[u]=reqt++;
}
int f[50010];
int find(int x)
{
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
void init(int maxn)
{
for(int i=0;i<=maxn;i++)
f[i]=i;
}
bool vis[50010];
int ans[50010];
void dfs(int u)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]) continue;
vis[v]=1;
dfs(v);
f[find(v)]=find(u);
}
for(int i=reqh[u];i;i=req[i].next)
{
int v=req[i].to;
if(!vis[v]) continue;
ans[req[i].w]=find(v);
}
}
int fa[50010],val[50010];
void init2(int u)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(fa[v]) continue;
fa[v]=u;
init2(v);
}
}
int ansn=0;
int getans(int u,int fa)
{
int ret=val[u];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
ret+=getans(v,u);
}
ansn=max(ansn,ret);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&st[i],&ed[i]);
addreq(st[i],ed[i],i);addreq(ed[i],st[i],i);
}
fa[s]=n+1;
init2(s);
init(n);
vis[s]=1;
dfs(s);
for(int i=1;i<=m;i++)
{
val[st[i]]++;val[ed[i]]++;
val[ans[i]]--;val[fa[ans[i]]]--;
}
getans(s,n+1);
printf("%d\n",ansn);
return 0;
}