using static System.Console;
using System.Collections.Generic;
using System.Linq;
string[] input = {
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
"a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
};
var a = new HashSet<string>();
var g = new List<HashSet<string>>();
foreach (var h in input.Select(s => s.Split('=').ToHashSet())) {
a.UnionWith(h);
var i = g.Select((x, i) => i).Where(i => g[i].Overlaps(h)).ToArray();
switch (i.Length) {
case 0: g.Add(h); break;
case 1: g[i[0]].UnionWith(h); break;
case 2: g[i[0]].UnionWith(g[i[1]]); g.RemoveAt(i[1]); break;
}
}
g.ForEach(x => WriteLine($"[{string.Join(", ", a.Intersect(x))}]"));
dXNpbmcgc3RhdGljIFN5c3RlbS5Db25zb2xlOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpzdHJpbmdbXSBpbnB1dCA9IHsKICAgICJhMT1hMiIsICJiMT1iMiIsICJiMz1iMiIsICJjMT1jMiIsICJlMT1lMiIsICJhMz1hNCIsICJjMz1jNCIsICJlMT1lMyIsCiAgICAiYTI9YTQiLCAiYzM9YzEiLCAiYjM9YTQiLCAiYzI9ZDEiLCAiYTQ9YTUiLCAiZDI9YzEiLCAiYjQ9YjMiLCAiZDM9YzMiCn07Cgp2YXIgYSA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKdmFyIGcgPSBuZXcgTGlzdDxIYXNoU2V0PHN0cmluZz4+KCk7Cgpmb3JlYWNoICh2YXIgaCBpbiBpbnB1dC5TZWxlY3QocyA9PiBzLlNwbGl0KCc9JykuVG9IYXNoU2V0KCkpKSB7CiAgICBhLlVuaW9uV2l0aChoKTsKICAgIHZhciBpID0gZy5TZWxlY3QoKHgsIGkpID0+IGkpLldoZXJlKGkgPT4gZ1tpXS5PdmVybGFwcyhoKSkuVG9BcnJheSgpOwogICAgc3dpdGNoIChpLkxlbmd0aCkgewogICAgICAgIGNhc2UgMDogZy5BZGQoaCk7IGJyZWFrOwogICAgICAgIGNhc2UgMTogZ1tpWzBdXS5VbmlvbldpdGgoaCk7IGJyZWFrOwogICAgICAgIGNhc2UgMjogZ1tpWzBdXS5VbmlvbldpdGgoZ1tpWzFdXSk7IGcuUmVtb3ZlQXQoaVsxXSk7IGJyZWFrOwogICAgfQp9CgpnLkZvckVhY2goeCA9PiBXcml0ZUxpbmUoJCJbe3N0cmluZy5Kb2luKCIsICIsIGEuSW50ZXJzZWN0KHgpKX1dIikpOw==
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]