#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
using ll = long long;
const int N = 50010;
int n, k, cnt;
int sz[N], son[N], f[N], id[N], top[N], d[N];
vector<int> g[N];
struct node {
int l, r;
ll t, maxn;
}tr[N << 2];
void pushdown(int p) {
if (tr[p].t) {
tr[ls].maxn += tr[p].t, tr[rs].maxn += tr[p].t;
tr[ls].t += tr[p].t, tr[rs].t = tr[p].t;
tr[p].t = 0;
}
}
void pushup(int p) {
tr[p].maxn = max(tr[ls].maxn, tr[rs].maxn);
}
void build(int p, int l, int r) {
tr[p] = { l,r,0,0 };
if (l == r)return;
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(p);
}
void update(int p, int l, int r, int k) {
if (tr[p].l >= l && tr[p].r <= r) {
tr[p].maxn += k;
tr[p].t += k;
return;
}
pushdown(p);
int m = tr[p].l + tr[p].r >> 1;
if (l <= m)update(ls, l, r, k);
if (r > m)update(rs, l, r, k);
pushup(p);
}
void dfs(int u, int fa) {
sz[u] = 1, f[u] = fa;
if (u == 1)d[u] = 1;
else d[u] = d[fa] + 1;
for (auto& s : g[u]) {
if (s == fa)continue;
dfs(s, u);
sz[u] += sz[s];
if (sz[son[u]] < sz[s])son[u] = s;
}
}
void dfs2(int u, int t) {
top[u] = t, id[u] = ++cnt;
if (!son[u])return;
dfs2(son[u], t);
for (auto& s : g[u]) {
if (s == f[u] || s == son[u])continue;
dfs2(s, s);
}
}
void update_path(int u, int v) {
while (top[u] != top[v]) {
if (d[top[u]] < d[top[v]])swap(u, v);
update(1, id[top[u]], id[u], 1);
u = f[top[u]];
}
if (d[u] < d[v])swap(u, v);
update(1, id[v], id[u], 1);
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, -1);
dfs2(1, 1);
build(1, 1, n);
while (k--) {
int u, v; cin >> u >> v;
update_path(u, v);
}
cout << tr[1].maxn;
return 0;
}