#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // c++11 #include #include #include #include #define mp make_pair #define mt make_tuple #define rep(i, n) for (int i = 0; i < (n); i++) using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair; const int INF = 1 << 29; const double EPS = 1e-9; const ll MOD = 1000000007; const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1}; const int MAX_N = 51; int N,M; int edges[MAX_N][MAX_N]; int cost[MAX_N][MAX_N]; int main() { cin >> N >> M; for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ if (i == j)continue; edges[i][j] = INF; } } for (int i = 0; i < M; i++){ int a,b; cin >> a >> b; edges[a][b] = 1; edges[b][a] = 1; } for (int k = 0; k < N; k++){ for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ edges[i][j] = min(edges[i][j], edges[i][k] + edges[k][j]); } } } int ans = 0; for (int i = 0; i < N; i++){ for (int j = i + 1; j < N; j++){ if (edges[i][j] == 2){ for (int k = 0; k < N; k++){ for (int l = k + 1; l < N; l++){ if (edges[i][k] == 1 and edges[j][k] == 1 and edges[i][l] == 1 and edges[j][l] == 1){ if (edges[k][l] == 2){ ans++; } } } } } } } cout << ans / 2<< endl; return 0; }