#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);
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+PiBnOwp2ZWN0b3I8aW50PiB0aW4sIGxvdywgaXNCcmlkZ2U7CmludCB0aW1lckRGUz0wOwoKdm9pZCBkZnNCcmlkZ2UoaW50IHUsIGludCBwRWRnZSl7CiAgICB0aW5bdV09bG93W3VdPSsrdGltZXJERlM7CiAgICBmb3IoYXV0byBlOmdbdV0pewogICAgICAgIGlmKGUuaWQ9PXBFZGdlKSBjb250aW51ZTsKICAgICAgICBpZighdGluW2UudG9dKXsKICAgICAgICAgICAgZGZzQnJpZGdlKGUudG8sZS5pZCk7CiAgICAgICAgICAgIGxvd1t1XT1taW4obG93W3VdLGxvd1tlLnRvXSk7CiAgICAgICAgICAgIGlmKGxvd1tlLnRvXT50aW5bdV0pIGlzQnJpZGdlW2UuaWRdPTE7CiAgICAgICAgfWVsc2UgbG93W3VdPW1pbihsb3dbdV0sdGluW2UudG9dKTsKICAgIH0KfQoKdmVjdG9yPGludD4gY29tcDsKdmVjdG9yPGludD4gY29tcFNpemU7CnZvaWQgZGZzQ29tcChpbnQgdSxpbnQgYyl7CiAgICBjb21wW3VdPWM7IGNvbXBTaXplW2NdKys7CiAgICBmb3IoYXV0byBlOmdbdV0pIGlmKGNvbXBbZS50b109PS0xICYmICFpc0JyaWRnZVtlLmlkXSkgZGZzQ29tcChlLnRvLGMpOwp9Cgp2ZWN0b3I8dmVjdG9yPGludD4+IHRyZWU7CnZlY3RvcjxpbnQ+IHN1YlNpemU7CnZlY3Rvcjxib29sPiByZW1vdmVkOwpsb25nIGxvbmcgYmFkUGFpcnM9MDsKCmludCBnZXRTaXplKGludCB1LGludCBwKXsKICAgIHN1YlNpemVbdV09Y29tcFNpemVbdV07CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgc3ViU2l6ZVt1XSs9Z2V0U2l6ZSh2LHUpOwogICAgcmV0dXJuIHN1YlNpemVbdV07Cn0KCmludCBnZXRDZW50cm9pZChpbnQgdSxpbnQgcCxpbnQgbil7CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgCiAgICAgICAgaWYoc3ViU2l6ZVt2XT5uLzIpIHJldHVybiBnZXRDZW50cm9pZCh2LHUsbik7CiAgICByZXR1cm4gdTsKfQoKdm9pZCBjb2xsZWN0KGludCB1LGludCBwLGludCBkLHZlY3RvcjxwYWlyPGludCxpbnQ+PiYgbm9kZXMpewogICAgbm9kZXMucHVzaF9iYWNrKHtkLGNvbXBTaXplW3VdfSk7CiAgICBmb3IoaW50IHY6dHJlZVt1XSkgaWYodiE9cCAmJiAhcmVtb3ZlZFt2XSkgY29sbGVjdCh2LHUsZCsxLG5vZGVzKTsKfQoKdm9pZCBzb2x2ZUNlbnRyb2lkKGludCBjKXsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGZyZXEoMSwwKTsKICAgIGZyZXFbMF09Y29tcFNpemVbY107CiAgICBmb3IoaW50IHY6dHJlZVtjXSkgaWYoIXJlbW92ZWRbdl0pewogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBkaXN0U3ViOwogICAgICAgIGNvbGxlY3QodixjLDEsZGlzdFN1Yik7CiAgICAgICAgaW50IG1heGQ9MDsKICAgICAgICBmb3IoYXV0byBbZCxfXTpkaXN0U3ViKSBtYXhkPW1heChtYXhkLGQpOwogICAgICAgIGlmKChpbnQpZnJlcS5zaXplKCk8bWF4ZCtLKzEpIGZyZXEucmVzaXplKG1heGQrSysxLDApOwoKICAgICAgICBmb3IoYXV0byBbZCxjbnRdOmRpc3RTdWIpewogICAgICAgICAgICBpbnQgbGltPUstZC0xOwogICAgICAgICAgICBpZihsaW0+PTApewogICAgICAgICAgICAgICAgbGltPW1pbihsaW0sKGludClmcmVxLnNpemUoKS0xKTsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBzPTA7CiAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPD1saW07aSsrKSBzKz1mcmVxW2ldOwogICAgICAgICAgICAgICAgYmFkUGFpcnMrPTFMTCpjbnQqczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IoYXV0byBbZCxjbnRdOmRpc3RTdWIpIGZyZXFbZF0rPWNudDsKICAgIH0KfQoKdm9pZCBkZWNvbXBvc2UoaW50IHUpewogICAgaW50IG49Z2V0U2l6ZSh1LC0xKTsKICAgIGludCBjPWdldENlbnRyb2lkKHUsLTEsbik7CiAgICBzb2x2ZUNlbnRyb2lkKGMpOwogICAgcmVtb3ZlZFtjXT10cnVlOwogICAgZm9yKGludCB2OnRyZWVbY10pIGlmKCFyZW1vdmVkW3ZdKSBkZWNvbXBvc2Uodik7Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbj4+Tj4+TT4+SzsKICAgIGcuYXNzaWduKE4rMSx7fSk7CiAgICBmb3IoaW50IGk9MTtpPD1NO2krKyl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHt2LGl9KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh7dSxpfSk7CiAgICB9CgogICAgdGluLmFzc2lnbihOKzEsMCk7IGxvdy5hc3NpZ24oTisxLDApOyBpc0JyaWRnZS5hc3NpZ24oTSsxLDApOwogICAgZm9yKGludCBpPTE7aTw9TjtpKyspIGlmKCF0aW5baV0pIGRmc0JyaWRnZShpLC0xKTsKCiAgICBjb21wLmFzc2lnbihOKzEsLTEpOwogICAgaW50IGNvbXBDbnQ9MDsKICAgIGZvcihpbnQgaT0xO2k8PU47aSsrKSBpZihjb21wW2ldPT0tMSl7IGNvbXBTaXplLnB1c2hfYmFjaygwKTsgZGZzQ29tcChpLGNvbXBDbnQrKyk7IH0KCiAgICB0cmVlLmFzc2lnbihjb21wQ250LHt9KTsKICAgIGZvcihpbnQgdT0xO3U8PU47dSsrKSBmb3IoYXV0byBlOmdbdV0pIGlmKGlzQnJpZGdlW2UuaWRdKXsKICAgICAgICBpbnQgY3U9Y29tcFt1XSwgY3Y9Y29tcFtlLnRvXTsKICAgICAgICBpZihjdSE9Y3YpIHRyZWVbY3VdLnB1c2hfYmFjayhjdik7CiAgICB9CgogICAgc3ViU2l6ZS5hc3NpZ24oY29tcENudCwwKTsKICAgIHJlbW92ZWQuYXNzaWduKGNvbXBDbnQsZmFsc2UpOwoKICAgIGxvbmcgbG9uZyB0b3RhbD1hY2N1bXVsYXRlKGNvbXBTaXplLmJlZ2luKCksY29tcFNpemUuZW5kKCksMExMKTsKICAgIGxvbmcgbG9uZyB0b3RhbFBhaXJzPXRvdGFsKih0b3RhbC0xKS8yOwoKICAgIGRlY29tcG9zZSgwKTsKICAgIGNvdXQ8PHRvdGFsUGFpcnMtYmFkUGFpcnM8PCJcbiI7Cn0K