class dsu: n = 1 parent_or_size = [-1 for i in range(n)] def __init__(self, N): self.n = N self.parent_or_size = [-1 for i in range(N)] def merge(self, a, b): assert 0 <= a < self.n, "0<=a 0: result2.append(result[i]) return result2 N, M = [int(x) for x in input().split()] edges = [] for _ in range(N - 1): u, v = [int(x) - 1 for x in input().split()] edges.append((u, v)) people = [] for _ in range(M): s, t = [int(x) - 1 for x in input().split()] people.append((s, t)) ok, ng = [0] * M, [N - 1] * M while any(abs(ok[i] - ng[i]) > 1 for i in range(M)): mid = [(ok[i] + ng[i]) // 2 for i in range(M)] check = [[] for _ in range(N)] for i, m in enumerate(mid): check[m].append(i) uf = dsu(N) for idx in range(N - 2, -1, -1): u, v = edges[idx] uf.merge(u, v) for i in check[idx]: s, t = people[i] if uf.same(s, t): ok[i] = idx else: ng[i] = idx count = [0] * N for v in ok: count[v] += 1 ans = M for c in count[:-1]: ans -= c print(ans)