#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, 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) {
int maxDepth = 0;
for (int v : tree[c]) if (!removed[v]) {
vector<pair<int,int>> tmp;
collect(v, c, 1, tmp);
for (auto [d,_] : tmp) maxDepth = max(maxDepth, d);
}
vector<long long> freq(maxDepth+K+5, 0);
freq[0] = compSize[c];
for (int v : tree[c]) if (!removed[v]) {
vector<pair<int,int>> distSub;
collect(v, c, 1, distSub);
for (auto [d, cnt] : distSub) {
int lim = K - d - 1;
if (lim >= 0) {
lim = min(lim, (int)freq.size()-1);
long long s = 0;
for (int i=0; i<=lim; i++) s += freq[i];
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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRWRnZSB7IGludCB0bywgaWQ7IH07CmludCBOLCBNLCBLOwp2ZWN0b3I8dmVjdG9yPEVkZ2U+PiBnOwp2ZWN0b3I8aW50PiB0aW4sIGxvdywgaXNCcmlkZ2U7CmludCB0aW1lckRGUyA9IDA7Cgp2b2lkIGRmc0JyaWRnZShpbnQgdSwgaW50IHBFZGdlKSB7CiAgICB0aW5bdV0gPSBsb3dbdV0gPSArK3RpbWVyREZTOwogICAgZm9yIChhdXRvIGUgOiBnW3VdKSB7CiAgICAgICAgaWYgKGUuaWQgPT0gcEVkZ2UpIGNvbnRpbnVlOwogICAgICAgIGlmICghdGluW2UudG9dKSB7CiAgICAgICAgICAgIGRmc0JyaWRnZShlLnRvLCBlLmlkKTsKICAgICAgICAgICAgbG93W3VdID0gbWluKGxvd1t1XSwgbG93W2UudG9dKTsKICAgICAgICAgICAgaWYgKGxvd1tlLnRvXSA+IHRpblt1XSkgaXNCcmlkZ2VbZS5pZF0gPSAxOwogICAgICAgIH0gZWxzZSBsb3dbdV0gPSBtaW4obG93W3VdLCB0aW5bZS50b10pOwogICAgfQp9Cgp2ZWN0b3I8aW50PiBjb21wLCBjb21wU2l6ZTsKdm9pZCBkZnNDb21wKGludCB1LCBpbnQgYykgewogICAgY29tcFt1XSA9IGM7IGNvbXBTaXplW2NdKys7CiAgICBmb3IgKGF1dG8gZSA6IGdbdV0pIGlmIChjb21wW2UudG9dID09IC0xICYmICFpc0JyaWRnZVtlLmlkXSkgZGZzQ29tcChlLnRvLCBjKTsKfQoKdmVjdG9yPHZlY3RvcjxpbnQ+PiB0cmVlOwp2ZWN0b3I8aW50PiBzdWJTaXplOwp2ZWN0b3I8Ym9vbD4gcmVtb3ZlZDsKbG9uZyBsb25nIGJhZFBhaXJzID0gMDsKCmludCBnZXRTaXplKGludCB1LCBpbnQgcCkgewogICAgc3ViU2l6ZVt1XSA9IGNvbXBTaXplW3VdOwogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIHN1YlNpemVbdV0gKz0gZ2V0U2l6ZSh2LCB1KTsKICAgIHJldHVybiBzdWJTaXplW3VdOwp9CgppbnQgZ2V0Q2VudHJvaWQoaW50IHUsIGludCBwLCBpbnQgbikgewogICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIGlmICh2ICE9IHAgJiYgIXJlbW92ZWRbdl0pIGlmIChzdWJTaXplW3ZdID4gbi8yKSByZXR1cm4gZ2V0Q2VudHJvaWQodiwgdSwgbik7CiAgICByZXR1cm4gdTsKfQoKdm9pZCBjb2xsZWN0KGludCB1LCBpbnQgcCwgaW50IGQsIHZlY3RvcjxwYWlyPGludCxpbnQ+PiYgbm9kZXMpIHsKICAgIG5vZGVzLnB1c2hfYmFjayh7ZCwgY29tcFNpemVbdV19KTsKICAgIGZvciAoaW50IHYgOiB0cmVlW3VdKSBpZiAodiAhPSBwICYmICFyZW1vdmVkW3ZdKSBjb2xsZWN0KHYsIHUsIGQrMSwgbm9kZXMpOwp9Cgp2b2lkIHNvbHZlQ2VudHJvaWQoaW50IGMpIHsKICAgIGludCBtYXhEZXB0aCA9IDA7CiAgICBmb3IgKGludCB2IDogdHJlZVtjXSkgaWYgKCFyZW1vdmVkW3ZdKSB7CiAgICAgICAgdmVjdG9yPHBhaXI8aW50LGludD4+IHRtcDsKICAgICAgICBjb2xsZWN0KHYsIGMsIDEsIHRtcCk7CiAgICAgICAgZm9yIChhdXRvIFtkLF9dIDogdG1wKSBtYXhEZXB0aCA9IG1heChtYXhEZXB0aCwgZCk7CiAgICB9CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBmcmVxKG1heERlcHRoK0srNSwgMCk7CiAgICBmcmVxWzBdID0gY29tcFNpemVbY107CgogICAgZm9yIChpbnQgdiA6IHRyZWVbY10pIGlmICghcmVtb3ZlZFt2XSkgewogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBkaXN0U3ViOwogICAgICAgIGNvbGxlY3QodiwgYywgMSwgZGlzdFN1Yik7CgogICAgICAgIGZvciAoYXV0byBbZCwgY250XSA6IGRpc3RTdWIpIHsKICAgICAgICAgICAgaW50IGxpbSA9IEsgLSBkIC0gMTsKICAgICAgICAgICAgaWYgKGxpbSA+PSAwKSB7CiAgICAgICAgICAgICAgICBsaW0gPSBtaW4obGltLCAoaW50KWZyZXEuc2l6ZSgpLTEpOwogICAgICAgICAgICAgICAgbG9uZyBsb25nIHMgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPD1saW07IGkrKykgcyArPSBmcmVxW2ldOwogICAgICAgICAgICAgICAgYmFkUGFpcnMgKz0gMUxMICogY250ICogczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChhdXRvIFtkLGNudF0gOiBkaXN0U3ViKSBmcmVxW2RdICs9IGNudDsKICAgIH0KfQoKdm9pZCBkZWNvbXBvc2UoaW50IHUpIHsKICAgIGludCBuID0gZ2V0U2l6ZSh1LCAtMSk7CiAgICBpbnQgYyA9IGdldENlbnRyb2lkKHUsIC0xLCBuKTsKICAgIHNvbHZlQ2VudHJvaWQoYyk7CiAgICByZW1vdmVkW2NdID0gdHJ1ZTsKICAgIGZvciAoaW50IHYgOiB0cmVlW2NdKSBpZiAoIXJlbW92ZWRbdl0pIGRlY29tcG9zZSh2KTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbiA+PiBOID4+IE0gPj4gSzsKICAgIGcuYXNzaWduKE4rMSwge30pOwogICAgZm9yIChpbnQgaT0xOyBpPD1NOyBpKyspIHsKICAgICAgICBpbnQgdSx2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHt2LGl9KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh7dSxpfSk7CiAgICB9CgogICAgdGluLmFzc2lnbihOKzEsMCk7IGxvdy5hc3NpZ24oTisxLDApOyBpc0JyaWRnZS5hc3NpZ24oTSsxLDApOwogICAgZm9yIChpbnQgaT0xOyBpPD1OOyBpKyspIGlmICghdGluW2ldKSBkZnNCcmlkZ2UoaSwtMSk7CgogICAgY29tcC5hc3NpZ24oTisxLC0xKTsKICAgIGludCBjb21wQ250PTA7CiAgICBmb3IgKGludCBpPTE7IGk8PU47IGkrKykgaWYgKGNvbXBbaV09PS0xKSB7IGNvbXBTaXplLnB1c2hfYmFjaygwKTsgZGZzQ29tcChpLGNvbXBDbnQrKyk7IH0KCiAgICB0cmVlLmFzc2lnbihjb21wQ250LHt9KTsKICAgIGZvciAoaW50IHU9MTsgdTw9TjsgdSsrKSBmb3IgKGF1dG8gZTpnW3VdKSBpZiAoaXNCcmlkZ2VbZS5pZF0pIHsKICAgICAgICBpbnQgY3U9Y29tcFt1XSwgY3Y9Y29tcFtlLnRvXTsKICAgICAgICBpZiAoY3UhPWN2KSB0cmVlW2N1XS5wdXNoX2JhY2soY3YpOwogICAgfQoKICAgIHN1YlNpemUuYXNzaWduKGNvbXBDbnQsMCk7CiAgICByZW1vdmVkLmFzc2lnbihjb21wQ250LGZhbHNlKTsKCiAgICBsb25nIGxvbmcgdG90YWwgPSBhY2N1bXVsYXRlKGNvbXBTaXplLmJlZ2luKCksY29tcFNpemUuZW5kKCksMExMKTsKICAgIGxvbmcgbG9uZyB0b3RhbFBhaXJzID0gdG90YWwqKHRvdGFsLTEpLzI7CiAgICBkZWNvbXBvc2UoMCk7CiAgICBjb3V0IDw8IHRvdGFsUGFpcnMgLSBiYWRQYWlycyA8PCAiXG4iOwp9Cg==