#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]) {
if (e.id == pEdge) continue;
if (!tin[e.to]) {
dfsBridge(e.to, e.id);
low[u] = min(low[u], low[e.to]);
if (low[e.to] > tin[u]) isBridge[e.id] = 1;
} else {
low[u] = min(low[u], tin[e.to]);
}
}
}
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;
long long badPairs = 0;
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;
}
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<long long> freq(1, 0);
freq[0] = compSize[c];
for (int v : tree[c]) if (!removed[v]) {
vector<pair<int,int>> distSub;
collect(v, c, 1, distSub);
int maxd = 0;
for (auto [d,_] : distSub) maxd = max(maxd, d);
if ((int)freq.size() < maxd + K + 1) freq.resize(maxd + K + 1, 0);
vector<long long> pref(freq.size(), 0);
for (int i=0; i<(int)freq.size(); i++) {
pref[i] = freq[i] + (i ? pref[i-1] : 0);
}
for (auto [d, cnt] : distSub) {
int lim = K - d - 1;
if (lim >= 0) {
lim = min(lim, (int)freq.size() - 1);
long long s = pref[lim];
badPairs += 1LL * cnt * s;
}
}
for (auto [d, cnt] : distSub) freq[d] += cnt;
}
}
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++);
}
tree.assign(compCnt, {});
for (int u=1; u<=N; u++) {
for (auto e : g[u]) if (isBridge[e.id]) {
int cu = comp[u], 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) / 2;
decompose(0);
cout << totalPairs - badPairs << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRWRnZSB7IGludCB0bywgaWQ7IH07CgppbnQgTiwgTSwgSzsKdmVjdG9yPHZlY3RvcjxFZGdlPj4gZzsKdmVjdG9yPGludD4gdGluLCBsb3csIGlzQnJpZGdlOwppbnQgdGltZXJERlMgPSAwOwoKdm9pZCBkZnNCcmlkZ2UoaW50IHUsIGludCBwRWRnZSkgewogICAgdGluW3VdID0gbG93W3VdID0gKyt0aW1lckRGUzsKICAgIGZvciAoYXV0byBlIDogZ1t1XSkgewogICAgICAgIGlmIChlLmlkID09IHBFZGdlKSBjb250aW51ZTsKICAgICAgICBpZiAoIXRpbltlLnRvXSkgewogICAgICAgICAgICBkZnNCcmlkZ2UoZS50bywgZS5pZCk7CiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1tlLnRvXSk7CiAgICAgICAgICAgIGlmIChsb3dbZS50b10gPiB0aW5bdV0pIGlzQnJpZGdlW2UuaWRdID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb3dbdV0gPSBtaW4obG93W3VdLCB0aW5bZS50b10pOwogICAgICAgIH0KICAgIH0KfQoKdmVjdG9yPGludD4gY29tcDsKdmVjdG9yPGludD4gY29tcFNpemU7CnZvaWQgZGZzQ29tcChpbnQgdSwgaW50IGMpIHsKICAgIGNvbXBbdV0gPSBjOwogICAgY29tcFNpemVbY10rKzsKICAgIGZvciAoYXV0byBlIDogZ1t1XSkgaWYgKGNvbXBbZS50b10gPT0gLTEgJiYgIWlzQnJpZGdlW2UuaWRdKSB7CiAgICAgICAgZGZzQ29tcChlLnRvLCBjKTsKICAgIH0KfQoKdmVjdG9yPHZlY3RvcjxpbnQ+PiB0cmVlOwp2ZWN0b3I8aW50PiBzdWJTaXplOwp2ZWN0b3I8Ym9vbD4gcmVtb3ZlZDsKbG9uZyBsb25nIGJhZFBhaXJzID0gMDsKCmludCBnZXRTaXplKGludCB1LCBpbnQgcCkgewogICAgc3ViU2l6ZVt1XSA9IGNvbXBTaXplW3VdOwogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIHsKICAgICAgICBzdWJTaXplW3VdICs9IGdldFNpemUodiwgdSk7CiAgICB9CiAgICByZXR1cm4gc3ViU2l6ZVt1XTsKfQoKaW50IGdldENlbnRyb2lkKGludCB1LCBpbnQgcCwgaW50IG4pIHsKICAgIGZvciAoaW50IHYgOiB0cmVlW3VdKSBpZiAodiAhPSBwICYmICFyZW1vdmVkW3ZdKSB7CiAgICAgICAgaWYgKHN1YlNpemVbdl0gPiBuLzIpIHJldHVybiBnZXRDZW50cm9pZCh2LCB1LCBuKTsKICAgIH0KICAgIHJldHVybiB1Owp9Cgp2b2lkIGNvbGxlY3QoaW50IHUsIGludCBwLCBpbnQgZCwgdmVjdG9yPHBhaXI8aW50LGludD4+JiBub2RlcykgewogICAgbm9kZXMucHVzaF9iYWNrKHtkLCBjb21wU2l6ZVt1XX0pOwogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIHsKICAgICAgICBjb2xsZWN0KHYsIHUsIGQrMSwgbm9kZXMpOwogICAgfQp9Cgp2b2lkIHNvbHZlQ2VudHJvaWQoaW50IGMpIHsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGZyZXEoMSwgMCk7CiAgICBmcmVxWzBdID0gY29tcFNpemVbY107CgogICAgZm9yIChpbnQgdiA6IHRyZWVbY10pIGlmICghcmVtb3ZlZFt2XSkgewogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBkaXN0U3ViOwogICAgICAgIGNvbGxlY3QodiwgYywgMSwgZGlzdFN1Yik7CiAgICAgICAgaW50IG1heGQgPSAwOwogICAgICAgIGZvciAoYXV0byBbZCxfXSA6IGRpc3RTdWIpIG1heGQgPSBtYXgobWF4ZCwgZCk7CiAgICAgICAgaWYgKChpbnQpZnJlcS5zaXplKCkgPCBtYXhkICsgSyArIDEpIGZyZXEucmVzaXplKG1heGQgKyBLICsgMSwgMCk7CgogICAgICAgIHZlY3Rvcjxsb25nIGxvbmc+IHByZWYoZnJlcS5zaXplKCksIDApOwogICAgICAgIGZvciAoaW50IGk9MDsgaTwoaW50KWZyZXEuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgcHJlZltpXSA9IGZyZXFbaV0gKyAoaSA/IHByZWZbaS0xXSA6IDApOwogICAgICAgIH0KCiAgICAgICAgZm9yIChhdXRvIFtkLCBjbnRdIDogZGlzdFN1YikgewogICAgICAgICAgICBpbnQgbGltID0gSyAtIGQgLSAxOwogICAgICAgICAgICBpZiAobGltID49IDApIHsKICAgICAgICAgICAgICAgIGxpbSA9IG1pbihsaW0sIChpbnQpZnJlcS5zaXplKCkgLSAxKTsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBzID0gcHJlZltsaW1dOwogICAgICAgICAgICAgICAgYmFkUGFpcnMgKz0gMUxMICogY250ICogczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChhdXRvIFtkLCBjbnRdIDogZGlzdFN1YikgZnJlcVtkXSArPSBjbnQ7CiAgICB9Cn0KCnZvaWQgZGVjb21wb3NlKGludCB1KSB7CiAgICBpbnQgbiA9IGdldFNpemUodSwgLTEpOwogICAgaW50IGMgPSBnZXRDZW50cm9pZCh1LCAtMSwgbik7CiAgICBzb2x2ZUNlbnRyb2lkKGMpOwogICAgcmVtb3ZlZFtjXSA9IHRydWU7CiAgICBmb3IgKGludCB2IDogdHJlZVtjXSkgaWYgKCFyZW1vdmVkW3ZdKSBkZWNvbXBvc2Uodik7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gTiA+PiBNID4+IEs7CiAgICBnLmFzc2lnbihOKzEsIHt9KTsKICAgIGZvciAoaW50IGk9MTsgaTw9TTsgaSsrKSB7CiAgICAgICAgaW50IHUsdjsgY2luID4+IHUgPj4gdjsKICAgICAgICBnW3VdLnB1c2hfYmFjayh7dixpfSk7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2soe3UsaX0pOwogICAgfQoKICAgIHRpbi5hc3NpZ24oTisxLDApOwogICAgbG93LmFzc2lnbihOKzEsMCk7CiAgICBpc0JyaWRnZS5hc3NpZ24oTSsxLDApOwogICAgZm9yIChpbnQgaT0xOyBpPD1OOyBpKyspIGlmICghdGluW2ldKSBkZnNCcmlkZ2UoaSwtMSk7CgogICAgY29tcC5hc3NpZ24oTisxLCAtMSk7CiAgICBpbnQgY29tcENudCA9IDA7CiAgICBmb3IgKGludCBpPTE7IGk8PU47IGkrKykgaWYgKGNvbXBbaV0gPT0gLTEpIHsKICAgICAgICBjb21wU2l6ZS5wdXNoX2JhY2soMCk7CiAgICAgICAgZGZzQ29tcChpLCBjb21wQ250KyspOwogICAgfQoKICAgIHRyZWUuYXNzaWduKGNvbXBDbnQsIHt9KTsKICAgIGZvciAoaW50IHU9MTsgdTw9TjsgdSsrKSB7CiAgICAgICAgZm9yIChhdXRvIGUgOiBnW3VdKSBpZiAoaXNCcmlkZ2VbZS5pZF0pIHsKICAgICAgICAgICAgaW50IGN1ID0gY29tcFt1XSwgY3YgPSBjb21wW2UudG9dOwogICAgICAgICAgICBpZiAoY3UgIT0gY3YpIHRyZWVbY3VdLnB1c2hfYmFjayhjdik7CiAgICAgICAgfQogICAgfQoKICAgIHN1YlNpemUuYXNzaWduKGNvbXBDbnQsIDApOwogICAgcmVtb3ZlZC5hc3NpZ24oY29tcENudCwgZmFsc2UpOwoKICAgIGxvbmcgbG9uZyB0b3RhbCA9IGFjY3VtdWxhdGUoY29tcFNpemUuYmVnaW4oKSwgY29tcFNpemUuZW5kKCksIDBMTCk7CiAgICBsb25nIGxvbmcgdG90YWxQYWlycyA9IHRvdGFsICogKHRvdGFsIC0gMSkgLyAyOwoKICAgIGRlY29tcG9zZSgwKTsKCiAgICBjb3V0IDw8IHRvdGFsUGFpcnMgLSBiYWRQYWlycyA8PCAiXG4iOwp9Cg==