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 Python (3.8.2) (judge verdict: Accepted)

# def friends(arr):
#     table = [{}]
#     for a in arr:
#         seted = False
#         for t in table:
#             if a[0] in t or a[1] in t:
#                 seted = True
#                 t.add(a[0])
#                 t.add(a[1])
#         if not seted:
#             table.append({a[0], a[1]})
#
#     return max(table, key=len)
# def start():
#     n, m = [int(x) for x in input().split(" ")]
#     arr = []
#     while m:
#         arr.append([int(x) for x in input().split(" ")])
#         m -= 1
#     print(len(friends(arr)))
# start()

def friends(n,arr):
    import collections
    graph = collections.defaultdict(list)
    for i in range(len(arr)):
        graph[arr[i][0]].append(arr[i][1])
        graph[arr[i][1]].append(arr[i][0])
    visited = [False]*(n+1)
    maxi = 0
    for i in range(1,n+1):
        if not visited[i]:
            queue = collections.deque()
            queue.append(i)
            visited[i] = True
            temp = 0
            while queue:
                temp += 1
                s = queue.popleft()
                for t in graph[s]:
                    if not visited[t]:
                        queue.append(t)
                        visited[t] = True
            maxi = max(maxi, temp)
    return maxi

def start():
    n, m = [int(x) for x in input().split(" ")]
    arr = []
    while m:
        arr.append([int(x) for x in input().split(" ")])
        m -= 1
    print((friends(n,arr)))
start()