1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<cmath>
6 #include<ctime>
7 #include<algorithm>
8 using namespace std;
9 struct node{int y,next;}e[1000010*2];
10 int n,m,len,ans,Link[10010],label[10010],vis[10010],q[10010],check[10010],col[10010];
11 inline int read()
12 {
13 int x=0,f=1; char ch=getchar();
14 while(!isdigit(ch)) {if(ch==‘-‘) f=-1; ch=getchar();}
15 while(isdigit(ch)) {x=x*10+ch-‘0‘; ch=getchar();}
16 return x*f;
17 }
18 void insert(int xx,int yy)
19 {
20 e[++len].next=Link[xx];
21 Link[xx]=len;
22 e[len].y=yy;
23 }
24 void MCS()//最大势算法求完美消除序列
25 {
26 for(int i=n;i;i--)
27 {
28 int now=0;
29 for(int j=1;j<=n;j++)
30 if(label[j]>=label[now]&&!vis[j]) now=j;
31 vis[now]=1; q[i]=now;
32 for(int j=Link[now];j;j=e[j].next)
33 label[e[j].y]++;
34 }
35 }
36 void color()//染色
37 {
38 for(int i=n;i;i--)
39 {
40 int now=q[i],j;
41 for(int j=Link[now];j;j=e[j].next) check[col[e[j].y]]=i;
42 for(j=1;;j++) if(check[j]!=i) break;
43 col[now]=j;
44 if(j>ans) ans=j;
45 }
46 }
47 int main()
48 {
49 n=read(); m=read();
50 for(int i=1;i<=m;i++)
51 {
52 int x=read(),y=read();
53 insert(x,y); insert(y,x);
54 }
55 MCS();
56 color();
57 printf("%d\n",ans);
58 return 0;
59 }