#include <bits/stdc++.h>
using namespace std;
struct Edge { int to, id; };
int N, M, K;
vector<vector<Edge>> g;
vector<int> tin, low, isBridge;
int timerDFS = 0;
void dfsBridge(int u, int pEdge) {
tin[u] = low[u] = ++timerDFS;
for (auto e : g[u]) {
int v = e.to, id = e.id;
if (id == pEdge) continue;
if (!tin[v]) {
dfsBridge(v, id);
low[u] = min(low[u], low[v]);
if (low[v] > tin[u]) {
isBridge[id] = 1;
}
} else {
low[u] = min(low[u], tin[v]);
}
}
}
vector<int> comp;
vector<int> compSize;
void dfsComp(int u, int c) {
comp[u] = c;
compSize[c]++;
for (auto e : g[u]) {
if (comp[e.to] == -1 && !isBridge[e.id]) {
dfsComp(e.to, c);
}
}
}
vector<vector<int>> tree;
vector<int> subSize;
vector<bool> removed;
int getSize(int u, int p) {
subSize[u] = compSize[u];
for (int v : tree[u]) if (v != p && !removed[v]) {
subSize[u] += getSize(v, u);
}
return subSize[u];
}
int getCentroid(int u, int p, int n) {
for (int v : tree[u]) if (v != p && !removed[v]) {
if (subSize[v] > n/2) return getCentroid(v, u, n);
}
return u;
}
long long badPairs = 0;
void collect(int u, int p, int d, vector<pair<int,int>>& nodes) {
nodes.push_back({d, compSize[u]});
for (int v : tree[u]) if (v != p && !removed[v]) {
collect(v, u, d+1, nodes);
}
}
void solveCentroid(int c) {
vector<pair<int,int>> distAll;
distAll.push_back({0, compSize[c]});
for (int v : tree[c]) if (!removed[v]) {
vector<pair<int,int>> distSub;
collect(v, c, 1, distSub);
for (auto [da, ca] : distSub) {
for (auto [db, cb] : distAll) {
if (da + db < K) badPairs += 1LL * ca * cb;
}
}
// merge vào distAll
distAll.insert(distAll.end(), distSub.begin(), distSub.end());
}
}
void decompose(int u) {
int n = getSize(u, -1);
int c = getCentroid(u, -1, n);
solveCentroid(c);
removed[c] = true;
for (int v : tree[c]) if (!removed[v]) {
decompose(v);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> M >> K;
g.assign(N+1, {});
for (int i=1; i<=M; i++) {
int u, v;
cin >> u >> v;
g[u].push_back({v, i});
g[v].push_back({u, i});
}
tin.assign(N+1, 0);
low.assign(N+1, 0);
isBridge.assign(M+1, 0);
for (int i=1; i<=N; i++) if (!tin[i]) dfsBridge(i, -1);
comp.assign(N+1, -1);
int compCnt = 0;
for (int i=1; i<=N; i++) {
if (comp[i] == -1) {
compSize.push_back(0);
dfsComp(i, compCnt);
compCnt++;
}
}
tree.assign(compCnt, {});
for (int u=1; u<=N; u++) {
for (auto e : g[u]) {
if (isBridge[e.id]) {
int cu = comp[u];
int cv = comp[e.to];
if (cu != cv) {
tree[cu].push_back(cv);
}
}
}
}
subSize.assign(compCnt, 0);
removed.assign(compCnt, false);
long long total = accumulate(compSize.begin(), compSize.end(), 0LL);
long long totalPairs = total * (total - 1);
decompose(0);
cout << totalPairs - badPairs << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRWRnZSB7IGludCB0bywgaWQ7IH07CgppbnQgTiwgTSwgSzsKdmVjdG9yPHZlY3RvcjxFZGdlPj4gZzsKdmVjdG9yPGludD4gdGluLCBsb3csIGlzQnJpZGdlOwppbnQgdGltZXJERlMgPSAwOwoKCnZvaWQgZGZzQnJpZGdlKGludCB1LCBpbnQgcEVkZ2UpIHsKICAgIHRpblt1XSA9IGxvd1t1XSA9ICsrdGltZXJERlM7CiAgICBmb3IgKGF1dG8gZSA6IGdbdV0pIHsKICAgICAgICBpbnQgdiA9IGUudG8sIGlkID0gZS5pZDsKICAgICAgICBpZiAoaWQgPT0gcEVkZ2UpIGNvbnRpbnVlOwogICAgICAgIGlmICghdGluW3ZdKSB7CiAgICAgICAgICAgIGRmc0JyaWRnZSh2LCBpZCk7CiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7CiAgICAgICAgICAgIGlmIChsb3dbdl0gPiB0aW5bdV0pIHsKICAgICAgICAgICAgICAgIGlzQnJpZGdlW2lkXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb3dbdV0gPSBtaW4obG93W3VdLCB0aW5bdl0pOwogICAgICAgIH0KICAgIH0KfQoKCnZlY3RvcjxpbnQ+IGNvbXA7CnZlY3RvcjxpbnQ+IGNvbXBTaXplOwp2b2lkIGRmc0NvbXAoaW50IHUsIGludCBjKSB7CiAgICBjb21wW3VdID0gYzsKICAgIGNvbXBTaXplW2NdKys7CiAgICBmb3IgKGF1dG8gZSA6IGdbdV0pIHsKICAgICAgICBpZiAoY29tcFtlLnRvXSA9PSAtMSAmJiAhaXNCcmlkZ2VbZS5pZF0pIHsKICAgICAgICAgICAgZGZzQ29tcChlLnRvLCBjKTsKICAgICAgICB9CiAgICB9Cn0KCgp2ZWN0b3I8dmVjdG9yPGludD4+IHRyZWU7CnZlY3RvcjxpbnQ+IHN1YlNpemU7CnZlY3Rvcjxib29sPiByZW1vdmVkOwoKaW50IGdldFNpemUoaW50IHUsIGludCBwKSB7CiAgICBzdWJTaXplW3VdID0gY29tcFNpemVbdV07CiAgICBmb3IgKGludCB2IDogdHJlZVt1XSkgaWYgKHYgIT0gcCAmJiAhcmVtb3ZlZFt2XSkgewogICAgICAgIHN1YlNpemVbdV0gKz0gZ2V0U2l6ZSh2LCB1KTsKICAgIH0KICAgIHJldHVybiBzdWJTaXplW3VdOwp9CgppbnQgZ2V0Q2VudHJvaWQoaW50IHUsIGludCBwLCBpbnQgbikgewogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIHsKICAgICAgICBpZiAoc3ViU2l6ZVt2XSA+IG4vMikgcmV0dXJuIGdldENlbnRyb2lkKHYsIHUsIG4pOwogICAgfQogICAgcmV0dXJuIHU7Cn0KCmxvbmcgbG9uZyBiYWRQYWlycyA9IDA7Cgp2b2lkIGNvbGxlY3QoaW50IHUsIGludCBwLCBpbnQgZCwgdmVjdG9yPHBhaXI8aW50LGludD4+JiBub2RlcykgewogICAgbm9kZXMucHVzaF9iYWNrKHtkLCBjb21wU2l6ZVt1XX0pOwogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIHsKICAgICAgICBjb2xsZWN0KHYsIHUsIGQrMSwgbm9kZXMpOwogICAgfQp9Cgp2b2lkIHNvbHZlQ2VudHJvaWQoaW50IGMpIHsKICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBkaXN0QWxsOwogICAgZGlzdEFsbC5wdXNoX2JhY2soezAsIGNvbXBTaXplW2NdfSk7CgogICAgZm9yIChpbnQgdiA6IHRyZWVbY10pIGlmICghcmVtb3ZlZFt2XSkgewogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBkaXN0U3ViOwogICAgICAgIGNvbGxlY3QodiwgYywgMSwgZGlzdFN1Yik7CgogICAgICAgIAogICAgICAgIGZvciAoYXV0byBbZGEsIGNhXSA6IGRpc3RTdWIpIHsKICAgICAgICAgICAgZm9yIChhdXRvIFtkYiwgY2JdIDogZGlzdEFsbCkgewogICAgICAgICAgICAgICAgaWYgKGRhICsgZGIgPCBLKSBiYWRQYWlycyArPSAxTEwgKiBjYSAqIGNiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIG1lcmdlIHbDoG8gZGlzdEFsbAogICAgICAgIGRpc3RBbGwuaW5zZXJ0KGRpc3RBbGwuZW5kKCksIGRpc3RTdWIuYmVnaW4oKSwgZGlzdFN1Yi5lbmQoKSk7CiAgICB9Cn0KCnZvaWQgZGVjb21wb3NlKGludCB1KSB7CiAgICBpbnQgbiA9IGdldFNpemUodSwgLTEpOwogICAgaW50IGMgPSBnZXRDZW50cm9pZCh1LCAtMSwgbik7CiAgICBzb2x2ZUNlbnRyb2lkKGMpOwogICAgcmVtb3ZlZFtjXSA9IHRydWU7CiAgICBmb3IgKGludCB2IDogdHJlZVtjXSkgaWYgKCFyZW1vdmVkW3ZdKSB7CiAgICAgICAgZGVjb21wb3NlKHYpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgY2luID4+IE4gPj4gTSA+PiBLOwogICAgZy5hc3NpZ24oTisxLCB7fSk7CiAgICBmb3IgKGludCBpPTE7IGk8PU07IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2soe3YsIGl9KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh7dSwgaX0pOwogICAgfQoKICAgIHRpbi5hc3NpZ24oTisxLCAwKTsKICAgIGxvdy5hc3NpZ24oTisxLCAwKTsKICAgIGlzQnJpZGdlLmFzc2lnbihNKzEsIDApOwoKICAgIGZvciAoaW50IGk9MTsgaTw9TjsgaSsrKSBpZiAoIXRpbltpXSkgZGZzQnJpZGdlKGksIC0xKTsKCiAgICBjb21wLmFzc2lnbihOKzEsIC0xKTsKICAgIGludCBjb21wQ250ID0gMDsKICAgIGZvciAoaW50IGk9MTsgaTw9TjsgaSsrKSB7CiAgICAgICAgaWYgKGNvbXBbaV0gPT0gLTEpIHsKICAgICAgICAgICAgY29tcFNpemUucHVzaF9iYWNrKDApOwogICAgICAgICAgICBkZnNDb21wKGksIGNvbXBDbnQpOwogICAgICAgICAgICBjb21wQ250Kys7CiAgICAgICAgfQogICAgfQoKICAgIHRyZWUuYXNzaWduKGNvbXBDbnQsIHt9KTsKICAgIGZvciAoaW50IHU9MTsgdTw9TjsgdSsrKSB7CiAgICAgICAgZm9yIChhdXRvIGUgOiBnW3VdKSB7CiAgICAgICAgICAgIGlmIChpc0JyaWRnZVtlLmlkXSkgewogICAgICAgICAgICAgICAgaW50IGN1ID0gY29tcFt1XTsKICAgICAgICAgICAgICAgIGludCBjdiA9IGNvbXBbZS50b107CiAgICAgICAgICAgICAgICBpZiAoY3UgIT0gY3YpIHsKICAgICAgICAgICAgICAgICAgICB0cmVlW2N1XS5wdXNoX2JhY2soY3YpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN1YlNpemUuYXNzaWduKGNvbXBDbnQsIDApOwogICAgcmVtb3ZlZC5hc3NpZ24oY29tcENudCwgZmFsc2UpOwoKICAgIGxvbmcgbG9uZyB0b3RhbCA9IGFjY3VtdWxhdGUoY29tcFNpemUuYmVnaW4oKSwgY29tcFNpemUuZW5kKCksIDBMTCk7CiAgICBsb25nIGxvbmcgdG90YWxQYWlycyA9IHRvdGFsICogKHRvdGFsIC0gMSk7CgogICAgZGVjb21wb3NlKDApOwoKICAgIGNvdXQgPDwgdG90YWxQYWlycyAtIGJhZFBhaXJzIDw8ICJcbiI7Cn0K