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 C (GCC 9.2.1) (judge verdict: Runtime Error)

#include <stdio.h>

#define MAX 200

void find_friends (int fri_one, int fri_two, int group[MAX][MAX], int *biggest);
 
int main (void) {
    int persons;
    int facts;

    scanf ("%d %d", &persons, &facts);

    int group[MAX][MAX] = {0};
    int biggest = 2;

    int i = 0;
    
    while (i < facts) {
        int fri_one;
        int fri_two;
        scanf ("%d %d",&fri_one, &fri_two);
        
        if (i == 0) {
            group[0][0] = fri_one;
            group[0][1] = fri_two;
        } else {
            find_friends(fri_one, fri_two, group, &biggest);
        }
         
        i++;
    }

    printf("%d\n", biggest);
    return 0;
}

void find_friends (int fri_one, int fri_two, int group[MAX][MAX], int *biggest) {
    int i = 0;
    int count = 1;
    int common = 0;
    int to_add;
    while (i < MAX) {
        int j = 0;
        while (group[i][j] != 0) {
            if (group[i][j] == fri_one) {
                to_add = fri_two;
                common++;
            }
            else if (group[i][j] == fri_two) {
                to_add = fri_one;
                common++;
            }
            count++;
            j++;
        }

        if (common == 1) {
            group[i][j] = to_add;
            i = MAX + 1;
            if (count > *biggest) {
                *biggest = count;
            }
        }
        i++;
    }
}