// base off ecnerwala's solution
#ifndef LOCAL
#define NDEBUG
#endif
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
namespace __gnu_pbds {
template <typename K, typename V=null_type>
using order_statistic_tree = tree<K, V, less<K>, rb_tree_tag, tree_order_statistics_node_update>;
}
using __gnu_pbds::order_statistic_tree;
using i64 = int64_t;
const int MAXN = 1.6e5;
int N, M, K;
vector<int> adj[MAXN];
vector<int> preorder;
int sz[MAXN];
int depth[MAXN];
int par[MAXN];
int heavyRoot[MAXN];
int st[MAXN];
int en[MAXN];
void dfs_sz(int cur, int prv) {
if (prv != -1) {
adj[cur].erase(find(adj[cur].begin(), adj[cur].end(), prv));
}
par[cur] = prv;
depth[cur] = (prv == -1 ? 0 : depth[prv]+1);
sz[cur] = 1;
for (int nxt : adj[cur]) {
dfs_sz(nxt, cur);
sz[cur] += sz[nxt];
}
nth_element(adj[cur].begin(), adj[cur].begin(), adj[cur].end(), [&](int i, int j) { return sz[i] > sz[j]; });
}
void dfs_hld(int cur) {
st[cur] = int(preorder.size());
preorder.push_back(cur);
heavyRoot[cur] = (par[cur] != -1 && st[cur] == st[par[cur]]+1) ? heavyRoot[par[cur]] : cur;
for (int nxt : adj[cur]) {
dfs_hld(nxt);
}
en[cur] = int(preorder.size());
}
int lca(int a, int b) {
while (heavyRoot[a] != heavyRoot[b]) {
// will st[a] > st[b] work?
if (st[a] > st[b]) {
swap(a, b);
}
b = par[heavyRoot[b]];
}
return st[a] < st[b] ? a : b;
}
int get_anc(int cur, int k) {
assert(k >= 0);
int d = depth[cur] - k;
while (d < depth[heavyRoot[cur]]) {
cur = par[heavyRoot[cur]];
}
return preorder[st[cur] - (depth[cur] - d)];
}
using evt_t = pair<pair<int, int>, int>;
vector<evt_t> evts[MAXN];
i64 ans = 0;
using tree_t = order_statistic_tree<evt_t>;
tree_t dfs(int cur) {
tree_t res;
int curPar = depth[cur] >= K ? get_anc(cur, K-1) : -1;
auto joinEvt = [&](pair<int, int> it) -> bool {
auto getSubtree = [&](int n) -> int {
return int(res.order_of_key({{en[n], -1}, -1})) - int(res.order_of_key({{st[n], -1}, -1}));
};
int stDest = it.first, c = it.second;
assert(!(st[cur] <= stDest && stDest < en[cur]));
int dest = preorder[stDest];
int totDist = depth[cur] + depth[dest] - 2 * depth[c];
if (totDist >= K) {
if (depth[cur] - depth[c] >= K) {
assert(curPar != -1);
ans += int(res.size()) - getSubtree(curPar);
} else {
ans += getSubtree(get_anc(dest, totDist - K));
}
if (stDest >= en[cur]) {
// event of the second kind
assert(par[dest] == c);
ans -= getSubtree(dest);
}
return true;
} else {
return false;
}
};
for (auto it : evts[cur]) {
if (joinEvt(it.first)) {
res.insert(it);
}
}
for (int nxt : adj[cur]) {
auto o = dfs(nxt);
for (auto lo = o.lower_bound({{st[cur], -1}, -1}); lo != o.end() && lo->first.first < en[cur]; ) {
lo = o.erase(lo);
}
if (o.size() > res.size()) res.swap(o);
for (auto it = o.begin(); it != o.end(); ) {
if (joinEvt(it->first)) {
++it;
} else {
it = o.erase(it);
}
}
for (auto evt : o) {
res.insert(evt);
}
}
return res;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> N >> M >> K;
for (int e = 0; e < N-1; e++) {
int u, v; cin >> u >> v; u--, v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs_sz(0, -1);
preorder.reserve(N);
dfs_hld(0);
assert(int(preorder.size()) == N);
int evtIdx = 0;
for (int i = 0; i < M; i++) {
int s, t; cin >> s >> t; s--, t--;
if (st[s] > st[t]) swap(s, t);
int c = lca(s, t);
evts[t].push_back({{st[s], c}, evtIdx++});
if (s != c) {
assert(depth[c] < depth[t]);
evts[s].push_back({{st[get_anc(t, depth[t] - depth[c] - 1)], c}, evtIdx++});
}
}
dfs(0);
cout << ans << '\n';
return 0;
}
Ly8gYmFzZSBvZmYgZWNuZXJ3YWxhJ3Mgc29sdXRpb24KI2lmbmRlZiBMT0NBTAojZGVmaW5lIE5ERUJVRwojZW5kaWYKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxiaXRzL2V4dGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbmFtZXNwYWNlIF9fZ251X3BiZHMgewp0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj1udWxsX3R5cGU+CnVzaW5nIG9yZGVyX3N0YXRpc3RpY190cmVlID0gdHJlZTxLLCBWLCBsZXNzPEs+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKfQp1c2luZyBfX2dudV9wYmRzOjpvcmRlcl9zdGF0aXN0aWNfdHJlZTsKCnVzaW5nIGk2NCA9IGludDY0X3Q7Cgpjb25zdCBpbnQgTUFYTiA9IDEuNmU1OwppbnQgTiwgTSwgSzsKdmVjdG9yPGludD4gYWRqW01BWE5dOwoKdmVjdG9yPGludD4gcHJlb3JkZXI7CmludCBzeltNQVhOXTsKaW50IGRlcHRoW01BWE5dOwppbnQgcGFyW01BWE5dOwoKaW50IGhlYXZ5Um9vdFtNQVhOXTsKaW50IHN0W01BWE5dOwppbnQgZW5bTUFYTl07Cgp2b2lkIGRmc19zeihpbnQgY3VyLCBpbnQgcHJ2KSB7CglpZiAocHJ2ICE9IC0xKSB7CgkJYWRqW2N1cl0uZXJhc2UoZmluZChhZGpbY3VyXS5iZWdpbigpLCBhZGpbY3VyXS5lbmQoKSwgcHJ2KSk7Cgl9CglwYXJbY3VyXSA9IHBydjsKCWRlcHRoW2N1cl0gPSAocHJ2ID09IC0xID8gMCA6IGRlcHRoW3Bydl0rMSk7CglzeltjdXJdID0gMTsKCglmb3IgKGludCBueHQgOiBhZGpbY3VyXSkgewoJCWRmc19zeihueHQsIGN1cik7CgkJc3pbY3VyXSArPSBzeltueHRdOwoJfQoKCW50aF9lbGVtZW50KGFkaltjdXJdLmJlZ2luKCksIGFkaltjdXJdLmJlZ2luKCksIGFkaltjdXJdLmVuZCgpLCBbJl0oaW50IGksIGludCBqKSB7IHJldHVybiBzeltpXSA+IHN6W2pdOyB9KTsKfQoKdm9pZCBkZnNfaGxkKGludCBjdXIpIHsKCXN0W2N1cl0gPSBpbnQocHJlb3JkZXIuc2l6ZSgpKTsKCXByZW9yZGVyLnB1c2hfYmFjayhjdXIpOwoKCWhlYXZ5Um9vdFtjdXJdID0gKHBhcltjdXJdICE9IC0xICYmIHN0W2N1cl0gPT0gc3RbcGFyW2N1cl1dKzEpID8gaGVhdnlSb290W3BhcltjdXJdXSA6IGN1cjsKCglmb3IgKGludCBueHQgOiBhZGpbY3VyXSkgewoJCWRmc19obGQobnh0KTsKCX0KCgllbltjdXJdID0gaW50KHByZW9yZGVyLnNpemUoKSk7Cn0KCmludCBsY2EoaW50IGEsIGludCBiKSB7Cgl3aGlsZSAoaGVhdnlSb290W2FdICE9IGhlYXZ5Um9vdFtiXSkgewoJCS8vIHdpbGwgc3RbYV0gPiBzdFtiXSB3b3JrPyAKCQlpZiAoc3RbYV0gPiBzdFtiXSkgewoJCQlzd2FwKGEsIGIpOwoJCX0KCQliID0gcGFyW2hlYXZ5Um9vdFtiXV07Cgl9CglyZXR1cm4gc3RbYV0gPCBzdFtiXSA/IGEgOiBiOwp9CgppbnQgZ2V0X2FuYyhpbnQgY3VyLCBpbnQgaykgewoJYXNzZXJ0KGsgPj0gMCk7CglpbnQgZCA9IGRlcHRoW2N1cl0gLSBrOwoJd2hpbGUgKGQgPCBkZXB0aFtoZWF2eVJvb3RbY3VyXV0pIHsKCQljdXIgPSBwYXJbaGVhdnlSb290W2N1cl1dOwoJfQoJcmV0dXJuIHByZW9yZGVyW3N0W2N1cl0gLSAoZGVwdGhbY3VyXSAtIGQpXTsKfQoKdXNpbmcgZXZ0X3QgPSBwYWlyPHBhaXI8aW50LCBpbnQ+LCBpbnQ+OwoKdmVjdG9yPGV2dF90PiBldnRzW01BWE5dOwppNjQgYW5zID0gMDsKCnVzaW5nIHRyZWVfdCA9IG9yZGVyX3N0YXRpc3RpY190cmVlPGV2dF90PjsKCnRyZWVfdCBkZnMoaW50IGN1cikgewoJdHJlZV90IHJlczsKCglpbnQgY3VyUGFyID0gZGVwdGhbY3VyXSA+PSBLID8gZ2V0X2FuYyhjdXIsIEstMSkgOiAtMTsKCglhdXRvIGpvaW5FdnQgPSBbJl0ocGFpcjxpbnQsIGludD4gaXQpIC0+IGJvb2wgewoJCWF1dG8gZ2V0U3VidHJlZSA9IFsmXShpbnQgbikgLT4gaW50IHsKCQkJcmV0dXJuIGludChyZXMub3JkZXJfb2Zfa2V5KHt7ZW5bbl0sIC0xfSwgLTF9KSkgLSBpbnQocmVzLm9yZGVyX29mX2tleSh7e3N0W25dLCAtMX0sIC0xfSkpOwoJCX07CgkJaW50IHN0RGVzdCA9IGl0LmZpcnN0LCBjID0gaXQuc2Vjb25kOwoJCWFzc2VydCghKHN0W2N1cl0gPD0gc3REZXN0ICYmIHN0RGVzdCA8IGVuW2N1cl0pKTsKCQlpbnQgZGVzdCA9IHByZW9yZGVyW3N0RGVzdF07CgoJCWludCB0b3REaXN0ID0gZGVwdGhbY3VyXSArIGRlcHRoW2Rlc3RdIC0gMiAqIGRlcHRoW2NdOwoJCWlmICh0b3REaXN0ID49IEspIHsKCQkJaWYgKGRlcHRoW2N1cl0gLSBkZXB0aFtjXSA+PSBLKSB7CgkJCQlhc3NlcnQoY3VyUGFyICE9IC0xKTsKCQkJCWFucyArPSBpbnQocmVzLnNpemUoKSkgLSBnZXRTdWJ0cmVlKGN1clBhcik7CgkJCX0gZWxzZSB7CgkJCQlhbnMgKz0gZ2V0U3VidHJlZShnZXRfYW5jKGRlc3QsIHRvdERpc3QgLSBLKSk7CgkJCX0KCQkJaWYgKHN0RGVzdCA+PSBlbltjdXJdKSB7CgkJCQkvLyBldmVudCBvZiB0aGUgc2Vjb25kIGtpbmQKCQkJCWFzc2VydChwYXJbZGVzdF0gPT0gYyk7CgkJCQlhbnMgLT0gZ2V0U3VidHJlZShkZXN0KTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfTsKCglmb3IgKGF1dG8gaXQgOiBldnRzW2N1cl0pIHsKCQlpZiAoam9pbkV2dChpdC5maXJzdCkpIHsKCQkJcmVzLmluc2VydChpdCk7CgkJfQoJfQoJZm9yIChpbnQgbnh0IDogYWRqW2N1cl0pIHsKCQlhdXRvIG8gPSBkZnMobnh0KTsKCQlmb3IgKGF1dG8gbG8gPSBvLmxvd2VyX2JvdW5kKHt7c3RbY3VyXSwgLTF9LCAtMX0pOyBsbyAhPSBvLmVuZCgpICYmIGxvLT5maXJzdC5maXJzdCA8IGVuW2N1cl07ICkgewoJCQlsbyA9IG8uZXJhc2UobG8pOwoJCX0KCQlpZiAoby5zaXplKCkgPiByZXMuc2l6ZSgpKSByZXMuc3dhcChvKTsKCQlmb3IgKGF1dG8gaXQgPSBvLmJlZ2luKCk7IGl0ICE9IG8uZW5kKCk7ICkgewoJCQlpZiAoam9pbkV2dChpdC0+Zmlyc3QpKSB7CgkJCQkrK2l0OwoJCQl9IGVsc2UgewoJCQkJaXQgPSBvLmVyYXNlKGl0KTsKCQkJfQoJCX0KCQlmb3IgKGF1dG8gZXZ0IDogbykgewoJCQlyZXMuaW5zZXJ0KGV2dCk7CgkJfQoJfQoKCXJldHVybiByZXM7Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCksIGNpbi50aWUoMCk7CgljaW4gPj4gTiA+PiBNID4+IEs7Cglmb3IgKGludCBlID0gMDsgZSA8IE4tMTsgZSsrKSB7CgkJaW50IHUsIHY7IGNpbiA+PiB1ID4+IHY7IHUtLSwgdi0tOwoJCWFkalt1XS5wdXNoX2JhY2sodik7CgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsKCX0KCglkZnNfc3ooMCwgLTEpOwoJcHJlb3JkZXIucmVzZXJ2ZShOKTsKCWRmc19obGQoMCk7Cglhc3NlcnQoaW50KHByZW9yZGVyLnNpemUoKSkgPT0gTik7CgoJaW50IGV2dElkeCA9IDA7Cglmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgewoJCWludCBzLCB0OyBjaW4gPj4gcyA+PiB0OyBzLS0sIHQtLTsKCQlpZiAoc3Rbc10gPiBzdFt0XSkgc3dhcChzLCB0KTsKCQlpbnQgYyA9IGxjYShzLCB0KTsKCQlldnRzW3RdLnB1c2hfYmFjayh7e3N0W3NdLCBjfSwgZXZ0SWR4Kyt9KTsKCQlpZiAocyAhPSBjKSB7CgkJCWFzc2VydChkZXB0aFtjXSA8IGRlcHRoW3RdKTsKCQkJZXZ0c1tzXS5wdXNoX2JhY2soe3tzdFtnZXRfYW5jKHQsIGRlcHRoW3RdIC0gZGVwdGhbY10gLSAxKV0sIGN9LCBldnRJZHgrK30pOwoJCX0KCX0KCglkZnMoMCk7Cgljb3V0IDw8IGFucyA8PCAnXG4nOwoKCXJldHVybiAwOwp9Cg==