#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;
long long badPairs=0;
vector<long long> dfsDP(int u,int p){
vector<long long> cnt(1, compSize[u]); // cnt[0] = size của BCC u
for(int v:tree[u]) if(v!=p){
auto child = dfsDP(v,u);
// đếm cặp giữa child và cnt
for(int dx=0; dx<(int)child.size(); dx++){
for(int dy=0; dy<(int)cnt.size(); dy++){
if(dx+dy+1 < K){
badPairs += child[dx] * cnt[dy];
}
}
}
// merge nhỏ vào lớn
if(child.size() > cnt.size()) swap(child,cnt);
for(int dx=0; dx<(int)child.size(); dx++){
cnt[dx+1] += child[dx];
}
}
return cnt;
}
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);
}
long long total=accumulate(compSize.begin(),compSize.end(),0LL);
long long totalPairs=total*(total-1)/2;
dfsDP(0,-1);
cout<<totalPairs-badPairs<<"\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRWRnZSB7IGludCB0bywgaWQ7IH07CmludCBOLCBNLCBLOwp2ZWN0b3I8dmVjdG9yPEVkZ2U+PiBnOwp2ZWN0b3I8aW50PiB0aW4sIGxvdywgaXNCcmlkZ2U7CmludCB0aW1lckRGUz0wOwoKdm9pZCBkZnNCcmlkZ2UoaW50IHUsIGludCBwRWRnZSl7CiAgICB0aW5bdV09bG93W3VdPSsrdGltZXJERlM7CiAgICBmb3IoYXV0byBlOmdbdV0pewogICAgICAgIGlmKGUuaWQ9PXBFZGdlKSBjb250aW51ZTsKICAgICAgICBpZighdGluW2UudG9dKXsKICAgICAgICAgICAgZGZzQnJpZGdlKGUudG8sZS5pZCk7CiAgICAgICAgICAgIGxvd1t1XT1taW4obG93W3VdLGxvd1tlLnRvXSk7CiAgICAgICAgICAgIGlmKGxvd1tlLnRvXT50aW5bdV0pIGlzQnJpZGdlW2UuaWRdPTE7CiAgICAgICAgfWVsc2UgbG93W3VdPW1pbihsb3dbdV0sdGluW2UudG9dKTsKICAgIH0KfQoKdmVjdG9yPGludD4gY29tcDsKdmVjdG9yPGludD4gY29tcFNpemU7CnZvaWQgZGZzQ29tcChpbnQgdSxpbnQgYyl7CiAgICBjb21wW3VdPWM7IGNvbXBTaXplW2NdKys7CiAgICBmb3IoYXV0byBlOmdbdV0pIGlmKGNvbXBbZS50b109PS0xICYmICFpc0JyaWRnZVtlLmlkXSkgZGZzQ29tcChlLnRvLGMpOwp9Cgp2ZWN0b3I8dmVjdG9yPGludD4+IHRyZWU7CmxvbmcgbG9uZyBiYWRQYWlycz0wOwoKdmVjdG9yPGxvbmcgbG9uZz4gZGZzRFAoaW50IHUsaW50IHApewogICAgdmVjdG9yPGxvbmcgbG9uZz4gY250KDEsIGNvbXBTaXplW3VdKTsgLy8gY250WzBdID0gc2l6ZSBj4bunYSBCQ0MgdQogICAgZm9yKGludCB2OnRyZWVbdV0pIGlmKHYhPXApewogICAgICAgIGF1dG8gY2hpbGQgPSBkZnNEUCh2LHUpOwogICAgICAgIC8vIMSR4bq/bSBj4bq3cCBnaeG7r2EgY2hpbGQgdsOgIGNudAogICAgICAgIGZvcihpbnQgZHg9MDsgZHg8KGludCljaGlsZC5zaXplKCk7IGR4KyspewogICAgICAgICAgICBmb3IoaW50IGR5PTA7IGR5PChpbnQpY250LnNpemUoKTsgZHkrKyl7CiAgICAgICAgICAgICAgICBpZihkeCtkeSsxIDwgSyl7CiAgICAgICAgICAgICAgICAgICAgYmFkUGFpcnMgKz0gY2hpbGRbZHhdICogY250W2R5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBuaOG7jyB2w6BvIGzhu5tuCiAgICAgICAgaWYoY2hpbGQuc2l6ZSgpID4gY250LnNpemUoKSkgc3dhcChjaGlsZCxjbnQpOwogICAgICAgIGZvcihpbnQgZHg9MDsgZHg8KGludCljaGlsZC5zaXplKCk7IGR4KyspewogICAgICAgICAgICBjbnRbZHgrMV0gKz0gY2hpbGRbZHhdOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjbnQ7Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbj4+Tj4+TT4+SzsKICAgIGcuYXNzaWduKE4rMSx7fSk7CiAgICBmb3IoaW50IGk9MTtpPD1NO2krKyl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHt2LGl9KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh7dSxpfSk7CiAgICB9CgogICAgdGluLmFzc2lnbihOKzEsMCk7IGxvdy5hc3NpZ24oTisxLDApOyBpc0JyaWRnZS5hc3NpZ24oTSsxLDApOwogICAgZm9yKGludCBpPTE7aTw9TjtpKyspIGlmKCF0aW5baV0pIGRmc0JyaWRnZShpLC0xKTsKCiAgICBjb21wLmFzc2lnbihOKzEsLTEpOwogICAgaW50IGNvbXBDbnQ9MDsKICAgIGZvcihpbnQgaT0xO2k8PU47aSsrKSBpZihjb21wW2ldPT0tMSl7IGNvbXBTaXplLnB1c2hfYmFjaygwKTsgZGZzQ29tcChpLGNvbXBDbnQrKyk7IH0KCiAgICB0cmVlLmFzc2lnbihjb21wQ250LHt9KTsKICAgIGZvcihpbnQgdT0xO3U8PU47dSsrKSBmb3IoYXV0byBlOmdbdV0pIGlmKGlzQnJpZGdlW2UuaWRdKXsKICAgICAgICBpbnQgY3U9Y29tcFt1XSwgY3Y9Y29tcFtlLnRvXTsKICAgICAgICBpZihjdSE9Y3YpIHRyZWVbY3VdLnB1c2hfYmFjayhjdik7CiAgICB9CgogICAgbG9uZyBsb25nIHRvdGFsPWFjY3VtdWxhdGUoY29tcFNpemUuYmVnaW4oKSxjb21wU2l6ZS5lbmQoKSwwTEwpOwogICAgbG9uZyBsb25nIHRvdGFsUGFpcnM9dG90YWwqKHRvdGFsLTEpLzI7CgogICAgZGZzRFAoMCwtMSk7CgogICAgY291dDw8dG90YWxQYWlycy1iYWRQYWlyczw8IlxuIjsKfQo=