Buggy python submission (verdict: Runtime Error):
#unionfind木_

def find(k):#要素k
    if par[k] == k:
        return par[k]
    else:
        par[k] = find(par[k])
        return par[k]

def union(i, j):
    i = find(i)
    j = find(j)
    if i==j: return False
    else:
        if rank[i] == rank[j]:#ランクが同じ場合
            par[j] = par[i]
            rank[i] += 1
        if rank[j] > rank[i]:
            i, j = j, i
            par[i] = par[j]
        else:
            par[i] = par[j]

n, m= map(int, input().split())
par = list(range(n))#初めは自分自身が親
rank = [1]*n

for i in range(m):
    a, b = map(lambda x:int(x)-1, input().split())
    union(a, b)

ans = [0]*n
for i in range(n):
    ans[find(ini_list[i])]+=1
print(max(ans))

Fixed submission:
#unionfind木_集合の管理_同じ集合の数を数える場合：
#parには集合の数と親の名前を同時にメモ化する（根なら-size, 子なら親）
def find(k):#要素k
    if par[k] < 0:#初期はparがすべて負の値
        return k
    else:
        par[k] = find(par[k])
        return par[k]

def unite(i, j):
    i = find(i)
    j = find(j)
    if i==j:#すでに同じ集合
        return False
    else:
        #sizeが大きい方がi
        if i > j:#sizeはマイナス管理なので、i>jの時jの方がサイズが大きい
            i, j = j, i
        par[i] += par[j] #親は負の値で大きくなる
        par[j] = i
        return True

def size(x):
    return -par[find(x)]

n, m= map(int, input().split())
par = [-1]*n#初めは自分自身が親

for i in range(m):
    a, b = map(lambda x:int(x)-1, input().split())
    unite(a, b)

ans = 0
for i in range(n):
    ans = max(ans, -par[i])
print(ans)

Buggy python submission (verdict: Runtime Error):
#unionfind木_
class unionfind():
    def __init__(self, init_list, ide_ele=1):
        self.par = init_list #初めは自分自身が親
        self.rank = [ide_ele]*len(init_list)

    def find(self, k):#要素k
        if self.par[k] == k:
            return self.par[k]
        else:
            self.par[k] = self.find(self.par[k])
            return self.par[k]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i==j: return False
        else:
            if self.rank[i] == self.rank[j]:#ランクが同じ場合
                self.par[j] = self.par[i]
                self.rank[i] += 1
            if self.rank[j] > self.rank[i]:
                i, j = j, i
                self.par[i] = self.par[j]
            else:
                self.par[i] = self.par[j]

n, m= map(int, input().split())
ini_list = list(range(n))
uni_tree = unionfind(ini_list)
for i in range(m):
    a, b = map(lambda x:int(x)-1, input().split())
    uni_tree.union(a, b)

ans = [0]*n
for i in range(n):
    ans[uni_tree.find(ini_list[i])]+=1
print(max(ans))

Fixed submission:
#unionfind木_集合の管理_同じ集合の数を数える場合：
#parには集合の数と親の名前を同時にメモ化する（根なら-size, 子なら親）
def find(k):#要素k
    if par[k] < 0:#初期はparがすべて負の値
        return k
    else:
        par[k] = find(par[k])
        return par[k]

def unite(i, j):
    i = find(i)
    j = find(j)
    if i==j:#すでに同じ集合
        return False
    else:
        #sizeが大きい方がi
        if i > j:#sizeはマイナス管理なので、i>jの時jの方がサイズが大きい
            i, j = j, i
        par[i] += par[j] #親は負の値で大きくなる
        par[j] = i
        return True

def size(x):
    return -par[find(x)]

n, m= map(int, input().split())
par = [-1]*n#初めは自分自身が親

for i in range(m):
    a, b = map(lambda x:int(x)-1, input().split())
    unite(a, b)

ans = 0
for i in range(n):
    ans = max(ans, -par[i])
print(ans)