using System; using System.Collections.Generic; using System.Text; using System.Linq; class Program { public void Proc() { Reader.IsDebug = false; int lineCount = int.Parse(Reader.ReadLine()); int inputCount = int.Parse(Reader.ReadLine()); int[] dic = new int[lineCount]; List numList = new List(); int ans = lineCount; for (int i = 1; i <= lineCount; i++) { numList.Add(i-1); } List amidaList = new List(); for (int i = 0; i < inputCount; i++) { int[] inpt = Reader.GetInt(); AmidaLine al = new AmidaLine(inpt[0]-1, inpt[1]-1, i); amidaList.Add(al); } for (int i = 0; i < lineCount; i++) { int pos = -1; int idx = i; for (int j = 0; j < inputCount; j++) { List select = new List(amidaList.FindAll(a => (a.Line1 == idx || a.Line2 == idx) && a.Pos > pos).OrderBy(b => b.Pos)); if (select.Count == 0) { break; } pos = select[0].Pos; idx = select[0].Goto(idx); } dic[i] = idx; } int[] target = numList.ToArray(); int[] conv = new int[target.Length]; int[] syuki = new int[target.Length]; for (int i = 0; i < int.MaxValue; i++) { conv = new int[target.Length]; bool isMatch = true; for (int j = 0; j < target.Length; j++) { conv[dic[j]] = target[j]; if (dic[j] != target[j]) { isMatch = false; } else if(syuki[dic[j]] == 0) { syuki[dic[j]] = i + 1; if (syuki.Count((a) => { return a == 0; }) == 0) { Console.WriteLine(this.GetKoubai(syuki)); return; } } } target = conv; if (isMatch) { ans = i + 1; break; } } Console.WriteLine(ans); } private long GetKoubai(int[] list) { List target = new List(list.Distinct()); Dictionary nums = new Dictionary(); target.ForEach((a) => { Dictionary ret = this.GetSoin(a); foreach (int key in ret.Keys) { if (!nums.ContainsKey(key)) { nums.Add(key, ret[key]); } else { nums[key] = Math.Max(nums[key], ret[key]); } } }); long ans = 1; foreach (int key in nums.Keys) { for (int i = 1; i <= nums[key]; i++) { ans *= key; } } return ans; } private Dictionary GetSoin(int src) { int num = src; Dictionary ans = new Dictionary(); while (num > 1) { bool isProc = false; for (int i = 2; i <= Math.Sqrt(num); i++) { if (num % i == 0) { isProc = true; if (!ans.ContainsKey(i)) { ans.Add(i, 1); } else { ans[i]++; } num = num / i; break; } } if (!isProc) { if (!ans.ContainsKey(num)) { ans.Add(num, 1); } else { ans[num]++; } break; } } return ans; } public class AmidaLine { public int Line1; public int Line2; public int Pos; public int Goto(int from) { if (from == Line1) { return Line2; } return Line1; } public AmidaLine(int l1, int l2, int p) { this.Line2 = l2; this.Line1 = l1; this.Pos = p; } } public class Reader { public static bool IsDebug = true; private static String PlainInput = @" "; private static System.IO.StringReader Sr = null; public static string ReadLine() { if (IsDebug) { if (Sr == null) { Sr = new System.IO.StringReader(PlainInput.Trim()); } return Sr.ReadLine(); } else { return Console.ReadLine(); } } public static int[] GetInt(char delimiter = ' ', bool trim = false) { string inptStr = ReadLine(); if (trim) { inptStr = inptStr.Trim(); } string[] inpt = inptStr.Split(delimiter); int[] ret = new int[inpt.Length]; for (int i = 0; i < inpt.Length; i++) { ret[i] = int.Parse(inpt[i]); } return ret; } } static void Main() { Program prg = new Program(); prg.Proc(); } }