n,m=list(map(int,input().split()))

par=[i for i in range(n)] #親

rank=[1]*n #深さ

size=[1]*n #iを根とするグループのサイズ

#親を見つける

def find(x):

  if par[x]==x:

    return x

  else:

    return find(par[x])

  

#xの属するグループとyの属するグループを併合

def unite(x,y):

  x=find(x)

  y=find(y)

  if x==y:

    return

  if rank[x]<rank[y]:

    par[x]=y

    size[y]=size[y]+size[x]

  else:

    par[y]=x

    size[x]=size[x]+size[y]

    if rank[x]==rank[y]:

      rank[x]+=1

      

#xとyが同じグループに属するかどうか

def same(x,y):

  return find(x)==find(y)



#check=set()

for i in range(m):

  a,b=list(map(int,input().split()))

  unite(a-1,b-1)

  

ans=0



for i in range(n):

  ans=max(ans,size[find(i)])

print(ans)



n,m=list(map(int,input().split()))



#Union-Find木

#par[i]:iの親　deep[i]:iの深さ　size[i]:iの大きさ

par=[i for i in range(n)]

deep=[1]*n

size=[1]*n



#親を見つける

def find(x):

  if par[x]==x:

    return x

  else:

    return find(par[x])



#二つのグループを統合する

def unite(x,y):

  x=find(x)

  y=find(y)

  if x==y:

    return

  if deep[x]<deep[y]:

    par[x]=y

    size[y]+=size[x]

  else:

    par[y]=x

    size[x]+=size[y]

    if deep[x]==deep[y]:

      deep[x]+=1



#xとyが同じグループに属するかどうか

def same(x,y):

  return find(x)==find(y)





for i in range(m):

  a,b=list(map(int,input().split()))

  unite(a-1,b-1)

print((max(size)))





  

  







      
n, m = list(map(int, input().split()))
par = [i for i in range(n)]  # 親
rank = [1] * n  # 深さ
size = [1] * n  # iを根とするグループのサイズ
# 親を見つける
def find(x):
    if par[x] == x:
        return x
    else:
        return find(par[x])


# xの属するグループとyの属するグループを併合
def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return
    if rank[x] < rank[y]:
        par[x] = y
        size[y] = size[y] + size[x]
    else:
        par[y] = x
        size[x] = size[x] + size[y]
        if rank[x] == rank[y]:
            rank[x] += 1


# xとyが同じグループに属するかどうか
def same(x, y):
    return find(x) == find(y)


# check=set()
for i in range(m):
    a, b = list(map(int, input().split()))
    unite(a - 1, b - 1)
ans = 0
for i in range(n):
    ans = max(ans, size[find(i)])
print(ans)

n, m = list(map(int, input().split()))
# Union-Find木
# par[i]:iの親　deep[i]:iの深さ　size[i]:iの大きさ
par = [i for i in range(n)]
deep = [1] * n
size = [1] * n
# 親を見つける
def find(x):
    if par[x] == x:
        return x
    else:
        return find(par[x])


# 二つのグループを統合する
def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return
    if deep[x] < deep[y]:
        par[x] = y
        size[y] += size[x]
    else:
        par[y] = x
        size[x] += size[y]
        if deep[x] == deep[y]:
            deep[x] += 1


# xとyが同じグループに属するかどうか
def same(x, y):
    return find(x) == find(y)


for i in range(m):
    a, b = list(map(int, input().split()))
    unite(a - 1, b - 1)
print((max(size)))

-par = [i for i in range(n)]  # 親 -rank = [1] * n  # 深さ -size = [1] * n  # iを根とするグループのサイズ +# Union-Find木 +# par[i]:iの親　deep[i]:iの深さ　size[i]:iの大きさ +par = [i for i in range(n)] +deep = [1] * n +size = [1] * n -# xの属するグループとyの属するグループを併合 +# 二つのグループを統合する -    if rank[x] < rank[y]: +    if deep[x] < deep[y]: -        size[y] = size[y] + size[x] +        size[y] += size[x] -        size[x] = size[x] + size[y] -        if rank[x] == rank[y]: -            rank[x] += 1 +        size[x] += size[y] +        if deep[x] == deep[y]: +            deep[x] += 1 -# check=set() -ans = 0 -for i in range(n): -    ans = max(ans, size[find(i)]) -print(ans) +print((max(size)))