class UnionFind
  def initialize(n); @data = Array.new(n, -1); end
  def find(a); @data[a] < 0 ? a : @data[a] = find(@data[a]); end
  def same?(a, b); find(a) == find(b); end
  def size(a); -@data[find(a)]; end

  def unite(a, b)
    a = find(a); b = find(b)
    return if a == b
    a, b = b, a if @data[a] > @data[b]
    @data[a] += @data[b]; @data[b] = a
  end
end

# UnionFind.new(N) := 要素数Nで初期化
# Ai := i番目の要素
# find(i) := Aiが属するグループ
# same?(i,j) := Ai,Ajが同じグループに属する
# size(i) := Aiが属するグループの要素の数
# unite(i,j) := Ai,Ajを同じグループに統合する

# uf = UnionFind.new(10)
# pp uf.same(1, 2)

class Problem
  attr_accessor *(?a..?z).to_a.map(&:to_sym)
  def initialize
    @n,@m = gets.split.map(&:to_i)
    @a,@b = Array.new(m){ gets.split.map(&:to_i).map{_1-1} }.transpose
    @u = UnionFind.new(n)
  end

  def init
    m.times do |i|
      u.unite(a[i],b[i])
    end
  end

  def solve
    init
    ans = 0
    n.times do |i|
      cnt = u.size(i)
      ans = cnt if ans < cnt
    end
    ans
  end

  def show(ans)
    puts ans
  end
end

Problem.new.instance_eval do
  show(solve)
end

