#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
int n , m, ans;
struct node{
int next, t;
}edge[100005];
int cnt, head[50005], dfn[50005], cha[50005], bz[50005][25], a[50005], vis[50005];
void add(int f, int t)
{
edge[cnt].t = t;
edge[cnt].next = head[f];
head[f] = cnt ++;
}
void dfs(int root, int deep)
{
dfn[root] = deep;
for(int i = head[root] ; i != -1 ; i = edge[i].next)
{
int v = edge[i].t;
if(!dfn[v])
{
bz[v][0] = root;
dfs(v,deep+1);
}
}
}
void deal()
{
for(int i = 1 ; i <= 20 ; i ++)
for(int j = 1 ; j <= n ; j ++)
bz[j][i] = bz[bz[j][i-1]][i-1];
}
int LCA(int x, int y)
{
if(dfn[x] < dfn[y])
swap(x,y);
for(int i = 20 ; i >= 0 ; i --)
if(dfn[bz[x][i]] >= dfn[y])
x = bz[x][i];
if(x == y) return x;
for(int i = 20 ; i >= 0 ; i --)
if(bz[x][i] ^ bz[y][i])
x = bz[x][i] , y = bz[y][i];
return bz[x][0];
}
void get_ans(int root)
{
vis[root] = 1;
for(int i = head[root] ; i != -1 ; i = edge[i].next)
{
int v = edge[i].t;
if(!vis[v]) {
get_ans(v);
cha[root] += cha[v];
}
}
ans = max(cha[root],ans);
}
int main(void)
{
mem(head,-1);
cin>>n>>m;
for(int i = 1 ; i < n ; i ++)
{
int u , v;
cin>>u>>v;
add(u,v);
add(v,u);
}
dfs(1,1);
deal();
for(int i = 1 ; i <= m ; i ++)
{
int u , v;
cin>>u>>v;
int lca = LCA(u,v);
cha[u] ++;
cha[v] ++;
cha[lca] --;
cha[bz[lca][0]] --;
}
ans = 0;
get_ans(1);
cout<<ans<<endl;
}