1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
#include <bits/stdc++.h>

using namespace std;

const int MAXM=5e5+10;

int n, m;
vector <pair <int, int> > g[MAXM], drz[MAXM], wst[MAXM];
int zak, zak2;
int odw[MAXM], nr, low[MAXM], gle[MAXM];
long long wyn, licz;

void dfs(int w, int gl)
{
	odw[w]=nr;
	++licz;
	gle[w]=gl;
	bool bojc=false;
	for(auto xd : g[w])
	{
		if(xd.second==zak||xd.second==zak2)
		{
			continue;
		}
		if(odw[xd.first]!=nr)
		{
			drz[w].push_back(xd);
			dfs(xd.first, gl+1);
		}
		else
		{
			if(gle[xd.first]+1<gle[w])
			{
				wst[w].push_back(xd);
			}
			else if(gle[xd.first]+1==gle[w])
			{
				if(bojc)
				{
					wst[w].push_back(xd);
				}
				else
				{
					bojc=true;
				}
			}
		}
	}
}

void dfs2(int w)
{
	odw[w]=nr;
	low[w]=gle[w];
	for(auto xd : drz[w])
	{
		dfs2(xd.first);
		low[w]=min(low[w], low[xd.first]);
	}
	for(auto xd : wst[w])
	{
		low[w]=min(low[w], gle[xd.first]);
	}
	for(auto xd : drz[w])
	{
		if(low[xd.first]==gle[xd.first]&&xd.second<zak)
		{
			++wyn;
		}
	}
}

int main()
{
	scanf("%d%d", &n, &m);
	for(int i=0; i<m; ++i)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		g[a].push_back({b, i});
		g[b].push_back({a, i});
	}
	for(int i=0; i<m; ++i)
	{
		for(int j=i+1; j<m; ++j)
		{
			for(int k=1; k<=n; ++k)
			{
				drz[k].clear();
				wst[k].clear();
			}
			zak=i;
			zak2=j;
			licz=0;
			++nr;
			dfs(1, 0);
			if(licz!=n)
			{
				wyn+=i;
				continue;
			}
			++nr;
			dfs2(1);
		}
	}
	printf("%lld\n", wyn);
	return 0;
}