def merge_all_intersecting(sets):
# merge all (i, end) sets into i-th set for all possible i indices
for i in range(len(sets) - 2, -1, -1):
# invariant: (i, end) sets are disjoint
for j in range(len(sets) - 1, i, -1):
if not sets[i].isdisjoint(sets[j]): # intersecting sets
sets[i].update(sets[j]) # merge j-th into i-th set
sets.pop(j) # remove merged set
sets = eval(input())
merge_all_intersecting(sets)
print(sets)
ZGVmIG1lcmdlX2FsbF9pbnRlcnNlY3Rpbmcoc2V0cyk6CiAgICAjIG1lcmdlIGFsbCAoaSwgZW5kKSBzZXRzICBpbnRvIGktdGggc2V0IGZvciBhbGwgcG9zc2libGUgaSBpbmRpY2VzCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc2V0cykgLSAyLCAtMSwgLTEpOiAKICAgICAgICAjIGludmFyaWFudDogKGksIGVuZCkgc2V0cyBhcmUgZGlzam9pbnQKICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oc2V0cykgLSAxLCBpLCAtMSk6CiAgICAgICAgICAgIGlmIG5vdCBzZXRzW2ldLmlzZGlzam9pbnQoc2V0c1tqXSk6ICAjIGludGVyc2VjdGluZyBzZXRzCiAgICAgICAgICAgICAgICBzZXRzW2ldLnVwZGF0ZShzZXRzW2pdKSAgIyBtZXJnZSBqLXRoIGludG8gaS10aCBzZXQKICAgICAgICAgICAgICAgIHNldHMucG9wKGopICAjIHJlbW92ZSBtZXJnZWQgc2V0CiAgICAgICAgIAoKc2V0cyA9IGV2YWwoaW5wdXQoKSkKbWVyZ2VfYWxsX2ludGVyc2VjdGluZyhzZXRzKQpwcmludChzZXRzKQ==
WyB7MSwgMn0sIHsyLCAzfSwgezMsIDR9LCB7MTAsIDExLCAxMn0sIHsxMCwgMTN9LCB7MjAsIDIxfSBd
[ {1, 2}, {2, 3}, {3, 4}, {10, 11, 12}, {10, 13}, {20, 21} ]
[{1, 2, 3, 4}, {10, 11, 12, 13}, {20, 21}]