Problem:
Score : 400 points

Problem Statement

There are N persons called Person 1 through Person N.

You are given M facts that "Person A_i and Person B_i are friends." The same fact may be given multiple times.

If X and Y are friends, and Y and Z are friends, then X and Z are also friends. There is no friendship that cannot be derived from the M given facts.

Takahashi the evil wants to divide the N persons into some number of groups so that every person has no friend in his/her group.

At least how many groups does he need to make?

Constraints

2 \leq N \leq 2\times 10^5

0 \leq M \leq 2\times 10^5

1\leq A_i,B_i\leq N

A_i \neq B_i

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
\vdots
A_M B_M

Output

Print the answer.

Sample Input 1

5 3
1 2
3 4
5 1

Sample Output 1

3

Dividing them into three groups such as \{1,3\}, \{2,4\}, and \{5\} achieves the goal.

Sample Input 2

4 10
1 2
2 1
1 2
2 1
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output 2

4

Sample Input 3

10 4
3 1
4 1
5 9
2 6

Sample Output 3

3

Solution in Rust (1.42.0) (judge verdict: Accepted)

// -*- coding:utf-8-unix -*-

use proconio::input;

// NOT WORK

fn root(v: &Vec<usize>, k: usize) -> usize {
    if v[k] == k {
        k
    } else {
        root(&v, v[k])
    }
}

fn main() {
    input! {
        n: usize,
        m: usize,
    }

    // constraint
    if m == 0 {
        println!("1");
        return;
    }

    let mut grp = 0;
    let mut vgrp = vec![0; n + 1];
    let mut vparent = vec![];
    for i in 0..n + 1 {
        vparent.push(i);

    }
    // let idx = vparent.clone();
    let mut vgrpnum = vec![0; n + 1];
    for _ in 0..m {
        input! {
            a: usize,
            b: usize,
        }
        // println!("a, b: {}, {}", a, b);
        if vgrp[a] == 0 && vgrp[b] == 0 {
            // new
            grp += 1;
            vgrp[a] = grp;
            vgrp[b] = grp;
            vgrpnum[grp as usize] = 2;
        } else {
            let root_a = root(&vparent, vgrp[a]);
            let root_b = root(&vparent, vgrp[b]);
            if root_a == 0 && root_b != 0 {
                // add a to group b
                vgrp[a] = root_b;
                vgrpnum[root_b] += 1;
            } else if root_a != 0 && root_b == 0 {
                // add b to group a
                vgrp[b] = root_a;
                vgrpnum[root_a] += 1;
            } else if root_a != root_b {
                if vgrpnum[root_b] < vgrpnum[root_a] {
                    // merge b to a
                    vgrp[b] = root_a;
                    vparent[root_b] = root_a;
                    vgrpnum[root_a] += vgrpnum[root_b];
                    vgrpnum[root_b] = 0;
                } else {
                    // merge a to b
                    vgrp[a] = root_b;
                    vparent[root_a] = root_b;
                    vgrpnum[root_b] += vgrpnum[root_a];
                    vgrpnum[root_a] = 0;
                }
            }
        }
        // println!("idx:     {:2?}", idx);
        // println!("vgrp:    {:2?}", vgrp);
        // println!("vparent: {:2?}", vparent);
        // println!("vgrpnum: {:2?}\n", vgrpnum);
    }

    let mut ans = 0;
    for i in 0..vgrpnum.len() {
        ans = ans.max(vgrpnum[i]);
    }
    println!("{}", ans);
}