#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 goodPairs=0;
vector<long long> freq; // freq[d] = số đỉnh ở khoảng cách d
int maxUsed=0; // độ sâu lớn nhất đã dùng
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){
// reset freq
for(int i=0;i<=maxUsed;i++) freq[i]=0;
maxUsed=0;
freq[0] = compSize[c];
maxUsed = 0;
for(int v:tree[c]) if(!removed[v]){
vector<pair<int,int>> distSub;
collect(v,c,1,distSub);
int localMax=0;
for(auto [d,_]:distSub) localMax=max(localMax,d);
maxUsed = max(maxUsed, localMax);
// chuẩn bị suffix để query nhanh
vector<long long> suff(maxUsed+2,0);
for(int i=maxUsed;i>=0;i--){
suff[i] = freq[i] + suff[i+1];
}
// đếm cặp giữa nhánh này và freq
for(auto [d,cnt]:distSub){
int lim = K-d;
if(lim<0) lim=0;
if(lim<=maxUsed){
long long s = suff[lim];
goodPairs += 1LL * cnt * s;
}
}
// merge nhánh vào freq
for(auto [d,cnt]:distSub){
if(d>maxUsed) maxUsed=d;
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);
freq.assign(N+5,0);
decompose(0);
cout<<goodPairs<<"\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRWRnZSB7IGludCB0bywgaWQ7IH07CmludCBOLCBNLCBLOwp2ZWN0b3I8dmVjdG9yPEVkZ2U+PiBnOwp2ZWN0b3I8aW50PiB0aW4sIGxvdywgaXNCcmlkZ2U7CmludCB0aW1lckRGUz0wOwoKdm9pZCBkZnNCcmlkZ2UoaW50IHUsIGludCBwRWRnZSl7CiAgICB0aW5bdV09bG93W3VdPSsrdGltZXJERlM7CiAgICBmb3IoYXV0byBlOmdbdV0pewogICAgICAgIGlmKGUuaWQ9PXBFZGdlKSBjb250aW51ZTsKICAgICAgICBpZighdGluW2UudG9dKXsKICAgICAgICAgICAgZGZzQnJpZGdlKGUudG8sZS5pZCk7CiAgICAgICAgICAgIGxvd1t1XT1taW4obG93W3VdLGxvd1tlLnRvXSk7CiAgICAgICAgICAgIGlmKGxvd1tlLnRvXT50aW5bdV0pIGlzQnJpZGdlW2UuaWRdPTE7CiAgICAgICAgfWVsc2UgbG93W3VdPW1pbihsb3dbdV0sdGluW2UudG9dKTsKICAgIH0KfQoKdmVjdG9yPGludD4gY29tcDsKdmVjdG9yPGludD4gY29tcFNpemU7CnZvaWQgZGZzQ29tcChpbnQgdSxpbnQgYyl7CiAgICBjb21wW3VdPWM7IGNvbXBTaXplW2NdKys7CiAgICBmb3IoYXV0byBlOmdbdV0pIGlmKGNvbXBbZS50b109PS0xICYmICFpc0JyaWRnZVtlLmlkXSkgZGZzQ29tcChlLnRvLGMpOwp9Cgp2ZWN0b3I8dmVjdG9yPGludD4+IHRyZWU7CnZlY3RvcjxpbnQ+IHN1YlNpemU7CnZlY3Rvcjxib29sPiByZW1vdmVkOwpsb25nIGxvbmcgZ29vZFBhaXJzPTA7Cgp2ZWN0b3I8bG9uZyBsb25nPiBmcmVxOyAvLyBmcmVxW2RdID0gc+G7kSDEkeG7iW5oIOG7nyBraG/huqNuZyBjw6FjaCBkCmludCBtYXhVc2VkPTA7ICAgICAgICAgIC8vIMSR4buZIHPDonUgbOG7m24gbmjhuqV0IMSRw6MgZMO5bmcKCmludCBnZXRTaXplKGludCB1LGludCBwKXsKICAgIHN1YlNpemVbdV09Y29tcFNpemVbdV07CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgc3ViU2l6ZVt1XSs9Z2V0U2l6ZSh2LHUpOwogICAgcmV0dXJuIHN1YlNpemVbdV07Cn0KCmludCBnZXRDZW50cm9pZChpbnQgdSxpbnQgcCxpbnQgbil7CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgCiAgICAgICAgaWYoc3ViU2l6ZVt2XT5uLzIpIHJldHVybiBnZXRDZW50cm9pZCh2LHUsbik7CiAgICByZXR1cm4gdTsKfQoKdm9pZCBjb2xsZWN0KGludCB1LGludCBwLGludCBkLHZlY3RvcjxwYWlyPGludCxpbnQ+PiYgbm9kZXMpewogICAgbm9kZXMucHVzaF9iYWNrKHtkLGNvbXBTaXplW3VdfSk7CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgY29sbGVjdCh2LHUsZCsxLG5vZGVzKTsKfQoKdm9pZCBzb2x2ZUNlbnRyb2lkKGludCBjKXsKICAgIC8vIHJlc2V0IGZyZXEKICAgIGZvcihpbnQgaT0wO2k8PW1heFVzZWQ7aSsrKSBmcmVxW2ldPTA7CiAgICBtYXhVc2VkPTA7CgogICAgZnJlcVswXSA9IGNvbXBTaXplW2NdOwogICAgbWF4VXNlZCA9IDA7CgogICAgZm9yKGludCB2OnRyZWVbY10pIGlmKCFyZW1vdmVkW3ZdKXsKICAgICAgICB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gZGlzdFN1YjsKICAgICAgICBjb2xsZWN0KHYsYywxLGRpc3RTdWIpOwogICAgICAgIGludCBsb2NhbE1heD0wOwogICAgICAgIGZvcihhdXRvIFtkLF9dOmRpc3RTdWIpIGxvY2FsTWF4PW1heChsb2NhbE1heCxkKTsKICAgICAgICBtYXhVc2VkID0gbWF4KG1heFVzZWQsIGxvY2FsTWF4KTsKCiAgICAgICAgLy8gY2h14bqpbiBi4buLIHN1ZmZpeCDEkeG7gyBxdWVyeSBuaGFuaAogICAgICAgIHZlY3Rvcjxsb25nIGxvbmc+IHN1ZmYobWF4VXNlZCsyLDApOwogICAgICAgIGZvcihpbnQgaT1tYXhVc2VkO2k+PTA7aS0tKXsKICAgICAgICAgICAgc3VmZltpXSA9IGZyZXFbaV0gKyBzdWZmW2krMV07CiAgICAgICAgfQoKICAgICAgICAvLyDEkeG6v20gY+G6t3AgZ2nhu69hIG5ow6FuaCBuw6B5IHbDoCBmcmVxCiAgICAgICAgZm9yKGF1dG8gW2QsY250XTpkaXN0U3ViKXsKICAgICAgICAgICAgaW50IGxpbSA9IEstZDsKICAgICAgICAgICAgaWYobGltPDApIGxpbT0wOwogICAgICAgICAgICBpZihsaW08PW1heFVzZWQpewogICAgICAgICAgICAgICAgbG9uZyBsb25nIHMgPSBzdWZmW2xpbV07CiAgICAgICAgICAgICAgICBnb29kUGFpcnMgKz0gMUxMICogY250ICogczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gbWVyZ2UgbmjDoW5oIHbDoG8gZnJlcQogICAgICAgIGZvcihhdXRvIFtkLGNudF06ZGlzdFN1Yil7CiAgICAgICAgICAgIGlmKGQ+bWF4VXNlZCkgbWF4VXNlZD1kOwogICAgICAgICAgICBmcmVxW2RdKz1jbnQ7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGRlY29tcG9zZShpbnQgdSl7CiAgICBpbnQgbj1nZXRTaXplKHUsLTEpOwogICAgaW50IGM9Z2V0Q2VudHJvaWQodSwtMSxuKTsKICAgIHNvbHZlQ2VudHJvaWQoYyk7CiAgICByZW1vdmVkW2NdPXRydWU7CiAgICBmb3IoaW50IHY6dHJlZVtjXSkgaWYoIXJlbW92ZWRbdl0pIGRlY29tcG9zZSh2KTsKfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgY2luPj5OPj5NPj5LOwogICAgZy5hc3NpZ24oTisxLHt9KTsKICAgIGZvcihpbnQgaT0xO2k8PU07aSsrKXsKICAgICAgICBpbnQgdSx2OyBjaW4+PnU+PnY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2soe3YsaX0pOwogICAgICAgIGdbdl0ucHVzaF9iYWNrKHt1LGl9KTsKICAgIH0KCiAgICB0aW4uYXNzaWduKE4rMSwwKTsgbG93LmFzc2lnbihOKzEsMCk7IGlzQnJpZGdlLmFzc2lnbihNKzEsMCk7CiAgICBmb3IoaW50IGk9MTtpPD1OO2krKykgaWYoIXRpbltpXSkgZGZzQnJpZGdlKGksLTEpOwoKICAgIGNvbXAuYXNzaWduKE4rMSwtMSk7CiAgICBpbnQgY29tcENudD0wOwogICAgZm9yKGludCBpPTE7aTw9TjtpKyspIGlmKGNvbXBbaV09PS0xKXsgY29tcFNpemUucHVzaF9iYWNrKDApOyBkZnNDb21wKGksY29tcENudCsrKTsgfQoKICAgIHRyZWUuYXNzaWduKGNvbXBDbnQse30pOwogICAgZm9yKGludCB1PTE7dTw9Tjt1KyspIGZvcihhdXRvIGU6Z1t1XSkgaWYoaXNCcmlkZ2VbZS5pZF0pewogICAgICAgIGludCBjdT1jb21wW3VdLCBjdj1jb21wW2UudG9dOwogICAgICAgIGlmKGN1IT1jdikgdHJlZVtjdV0ucHVzaF9iYWNrKGN2KTsKICAgIH0KCiAgICBzdWJTaXplLmFzc2lnbihjb21wQ250LDApOwogICAgcmVtb3ZlZC5hc3NpZ24oY29tcENudCxmYWxzZSk7CiAgICBmcmVxLmFzc2lnbihOKzUsMCk7CgogICAgZGVjb21wb3NlKDApOwoKICAgIGNvdXQ8PGdvb2RQYWlyczw8IlxuIjsKfQo=