#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 2e5 + 5;
// Ta có tính chất sau của cây: tất cả các cạnh của cây đều là cạnh cầu
// Nhận xét:
// Khi ta thêm một cạnh (u, v) vào cây thì chắc chắn sẽ tạo chu trình,
// chu trình này sẽ chứa hết tất cả các cạnh trên đường đi từ u đến v ở trên cây
// Dẫn đến các cạnh này không còn là cạnh cầu nữa
// Từ đây với mỗi truy vấn cần đánh dấu các cạnh nằm trên đường đi từ u đến v
// thì ta sẽ thêm cạnh (u, v) vào đồ thị
// Sau toàn bộ truy vấn, những cạnh cầu có trong đồ thị sẽ là những cạnh mà chưa được đánh dấu
// Lưu ý đồ thị lúc này có thể là đa đồ thị (giữa 2 đỉnh bất kì có thể có nhiều cạnh nối)
int n;
int m;
vector<int> adj[N];
int tin[N], low[N], timer;
int cnt_bridge;
void dfs(int u, int p) {
tin[u] = low[u] = ++timer;
bool parent_skipped = true;
for (int v : adj[u]) {
if (v == p && parent_skipped) {
parent_skipped = false;
continue;
}
if (!tin[v]) {
dfs(v, u);
low[u] = min(low[u], low[v]);
if (low[v] > tin[u]) cnt_bridge++;
}
else {
low[u] = min(low[u], tin[v]);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
cin >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
timer = 0;
cnt_bridge = 0;
dfs(1, -1);
cout << cnt_bridge << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAyZTUgKyA1OyAKCi8vIFRhIGPDsyB0w61uaCBjaOG6pXQgc2F1IGPhu6dhIGPDonk6IHThuqV0IGPhuqMgY8OhYyBj4bqhbmggY+G7p2EgY8OieSDEkeG7gXUgbMOgIGPhuqFuaCBj4bqndQovLyBOaOG6rW4geMOpdDogCi8vIEtoaSB0YSB0aMOqbSBt4buZdCBj4bqhbmggKHUsIHYpIHbDoG8gY8OieSB0aMOsIGNo4bqvYyBjaOG6r24gc+G6vSB04bqhbyBjaHUgdHLDrG5oLCAKLy8gY2h1IHRyw6xuaCBuw6B5IHPhur0gY2jhu6lhIGjhur90IHThuqV0IGPhuqMgY8OhYyBj4bqhbmggdHLDqm4gxJHGsOG7nW5nIMSRaSB04burIHUgxJHhur9uIHYg4bufIHRyw6puIGPDonkKLy8gROG6q24gxJHhur9uIGPDoWMgY+G6oW5oIG7DoHkga2jDtG5nIGPDsm4gbMOgIGPhuqFuaCBj4bqndSBu4buvYQoKLy8gVOG7qyDEkcOieSB24bubaSBt4buXaSB0cnV5IHbhuqVuIGPhuqduIMSRw6FuaCBk4bqldSBjw6FjIGPhuqFuaCBu4bqxbSB0csOqbiDEkcaw4budbmcgxJFpIHThu6sgdSDEkeG6v24gdgovLyB0aMOsIHRhIHPhur0gdGjDqm0gY+G6oW5oICh1LCB2KSB2w6BvIMSR4buTIHRo4buLCi8vIFNhdSB0b8OgbiBi4buZIHRydXkgduG6pW4sIG5o4buvbmcgY+G6oW5oIGPhuqd1IGPDsyB0cm9uZyDEkeG7kyB0aOG7iyBz4bq9IGzDoCBuaOG7r25nIGPhuqFuaCBtw6AgY2jGsGEgxJHGsOG7o2MgxJHDoW5oIGThuqV1Ci8vIEzGsHUgw70gxJHhu5MgdGjhu4sgbMO6YyBuw6B5IGPDsyB0aOG7gyBsw6AgxJFhIMSR4buTIHRo4buLIChnaeG7r2EgMiDEkeG7iW5oIGLhuqV0IGvDrCBjw7MgdGjhu4MgY8OzIG5oaeG7gXUgY+G6oW5oIG7hu5FpKQppbnQgbjsgCmludCBtOyAgIAp2ZWN0b3I8aW50PiBhZGpbTl07CgppbnQgdGluW05dLCBsb3dbTl0sIHRpbWVyOyAgCmludCBjbnRfYnJpZGdlOyAKCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewoJdGluW3VdID0gbG93W3VdID0gKyt0aW1lcjsgCgoJYm9vbCBwYXJlbnRfc2tpcHBlZCA9IHRydWU7ICAKCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwICYmIHBhcmVudF9za2lwcGVkKSB7CgkJCXBhcmVudF9za2lwcGVkID0gZmFsc2U7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKCF0aW5bdl0pIHsKCQkJZGZzKHYsIHUpOwoJCQlsb3dbdV0gPSBtaW4obG93W3VdLCBsb3dbdl0pOwoJCQlpZiAobG93W3ZdID4gdGluW3VdKSBjbnRfYnJpZGdlKys7CgkJfQoJCWVsc2UgewoJCQlsb3dbdV0gPSBtaW4obG93W3VdLCB0aW5bdl0pOwoJCX0KCX0KfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG47Cglmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKCQlpbnQgdSwgdjsgCgkJY2luID4+IHUgPj4gdjsgCgkJYWRqW3VdLnB1c2hfYmFjayh2KTsKCQlhZGpbdl0ucHVzaF9iYWNrKHUpOyAKCX0KCgljaW4gPj4gbTsgCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCB1LCB2OyAKCQljaW4gPj4gdSA+PiB2OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOyAKCQlhZGpbdl0ucHVzaF9iYWNrKHUpOyAKCX0KCgl0aW1lciA9IDA7ICAgCgljbnRfYnJpZGdlID0gMDsgICAKCWRmcygxLCAtMSk7IAoKCWNvdXQgPDwgY250X2JyaWRnZSA8PCAnXG4nOyAKfQ==