import java.lang.IllegalArgumentException

fun main(args: Array<String>) {
	val (n, m) = readLine()?.split(" ")?.map {it.toInt()} ?: throw IllegalArgumentException()
	val unionFind = UnionFind(n)
	for (i in 0 until m) {
		unionFind.addUnion(readLine()?.split(" ")?.map {it.toInt()} ?: throw IllegalArgumentException())
	}
	println(unionFind.maxUnionSize())
}

data class UnionFind(val n: Int, val parentList: MutableList<Int> = MutableList(n+1) {it}, val unionNumberList: MutableList<Int> = MutableList(n+1) {1}) {
	fun addUnion(friends: List<Int>) {
		val (parent, child) = if (friends[0] < friends[1]) Pair(friends[0], friends[1]) else Pair(friends[1], friends[0])
		val indexOfRootParent = findRoot(parent)
		val indexOfRootChild = findRoot(child)
		//2人が同じグループに所属していた場合、そのまま。
		if (indexOfRootParent == indexOfRootChild) return
		//2人が異なるグループに所属していた場合、2つのグループのメンバーが全てParent側に所属するようにする。
		//println("${indexOfRootChild}, ${indexOfRootParent}, ${unionNumberList[indexOfRootChild]}, ${unionNumberList[indexOfRootParent]}")
		unionNumberList[indexOfRootParent] += unionNumberList[indexOfRootChild]
		//Child側のグループは0人になる
		unionNumberList[indexOfRootChild] = 0
		//Childのrootの親を設定する
		parentList[indexOfRootChild] = indexOfRootParent
	}
	
	private fun findRoot(i: Int): Int {
		//rootならrootのindex、rootじゃないなら親がrootか調べる。
		return if (parentList[i] == i) i else {
			parentList[i] = findRoot(parentList[i])
			parentList[i]
		}
	}
	
	fun maxUnionSize(): Int {
		return unionNumberList.max() ?: return 0
	}
}