func readTwoInts(separator: String.Element = " ") -> (a: Int, b: Int) {
    let ints = readLine()!.split(separator: separator).map { Int($0)! }
    return (a: ints[0], b: ints[1])
}

func mainD() {
    let (N, M) = readTwoInts()
    let pairs = (0..<M).map { _ in readTwoInts() }

    var groups: [Set<Int>] = (1...N).map { Set(arrayLiteral: $0) }
    pairs.forEach { pair in
        groups[pair.a - 1].insert(pair.b)
        groups[pair.b - 1].insert(pair.a)
    }

    pairs.forEach { pair in
        for id in groups[pair.a - 1] {
            groups[pair.b - 1].insert(id)
        }

        for id in groups[pair.b - 1] {
            groups[pair.a - 1].insert(id)
        }
    }

    // それぞれの直接の友達をセットアップ(片側だけ)
//    var persons: [Person] = (1...N).map { Person(id: $0) }
//    pairs.forEach { pair in
//        persons[pair.a - 1].friends.insert(pair.b)
//        persons[pair.b - 1].friends.insert(pair.a)
//    }

//    var groups: [Set<Int>] = []
//    for person in persons {
//        var needNewGroup = true
//
//        for i in (0..<groups.count) {
//            if !groups[i].intersection(person.friends).isEmpty {
//                needNewGroup = false
//
//                groups[i].insert(person.id)
//                for id in person.friends {
//                    groups[i].insert(id)
//                }
//                break
//            }
//        }
//
//        if needNewGroup {
//            var newGroup = Set(person.friends)
//            newGroup.insert(person.id)
//            groups.append(newGroup)
//        }
//    }

    // 最大人数の判定
    print(groups.map { $0.count }.max()!)
}
mainD()