n,m=gets.split.map &:to_i
s={}
par=[*0...n]
fr=->x{
  u=par[x]
  return u==x ? x : par[x]=fr[u]
}
fu=->x,y{
  x=fr[x]
  y=fr[y]
  par[y]=x if x!=y
}
m.times{
  a,b=gets.split.map{|e| e.to_i-1 }.minmax
  r=s[a]||={}
  next if r[b]
  r[b]=true
  fu[a,b]
}
c={}
n.times{|e|
  r=fr[e]
  c[r]=1+(c[r]||0)
}
puts c.values.max