use std::collections::HashSet; fn main() { let mut nm = String::new(); std::io::stdin().read_line(&mut nm).ok(); let nm: Vec = nm.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nm[0]; let m = nm[1]; let mut ab: Vec> = vec![vec![]; n]; for _ in 0..m { let mut abtemp = String::new(); std::io::stdin().read_line(&mut abtemp).ok(); let abtemp: Vec = abtemp.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); ab[abtemp[0]].push(abtemp[1]); ab[abtemp[1]].push(abtemp[0]); } let mut result: HashSet<(usize, usize, usize, usize)> = HashSet::new(); for i in 0..n { if ab[i].len() < 2 { continue; } for j in 0..ab[i].len() { for k in j+1..ab[i].len() { let a = i; let b = ab[i][j]; let c = ab[i][k]; if ab[b].contains(&c) || ab[c].contains(&b) { continue; } ab[b].iter().filter(|d| **d != a && ab[c].contains(&d) && !ab[**d].contains(&a)) .map(|d| { let mut ret = vec![a, b, c, *d]; ret.sort(); ret }) .for_each(|v| { result.insert((v[0], v[1], v[2], v[3])); }); } } } println!("{}", result.len()); }