#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>
using namespace std;
vector<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"
};
int main(void)
{
map<string, int> g;
vector<string> id;
for (string &t : input) {
int i = t.find('=');
string a = t.substr(0, i);
string b = t.substr(i + 1);
bool hasa = g.find(a) != g.end();
bool hasb = g.find(b) != g.end();
if (!hasa) id.push_back(a);
if (!hasb) id.push_back(b);
switch (hasa << 1 | hasb) {
case 0:
g[b] = g[a] = g.size();
break;
case 1:
g[a] = g[b];
break;
case 2:
g[b] = g[a];
break;
case 3:
int j = min(g[a], g[b]);
int k = max(g[a], g[b]);
for (auto &x : g) if (x.second == k) x.second = j;
}
}
set<int> s;
for (auto &x : g) s.insert(x.second);
for (int i : s) {
bool first = true;
for (auto &x : id) if (g[x] == i) cout << (first ? first = false, "[" : ", ") << x;
cout << "]" << endl;
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxzdHJpbmc+IGlucHV0ID0gewogICAgImExPWEyIiwgImIxPWIyIiwgImIzPWIyIiwgImMxPWMyIiwgImUxPWUyIiwgImEzPWE0IiwgImMzPWM0IiwgImUxPWUzIiwKICAgICJhMj1hNCIsICJjMz1jMSIsICJiMz1hNCIsICJjMj1kMSIsICJhND1hNSIsICJkMj1jMSIsICJiND1iMyIsICJkMz1jMyIKfTsKCmludCBtYWluKHZvaWQpCnsKICAgIG1hcDxzdHJpbmcsIGludD4gZzsKICAgIHZlY3RvcjxzdHJpbmc+IGlkOwoKICAgIGZvciAoc3RyaW5nICZ0IDogaW5wdXQpIHsKICAgICAgICBpbnQgaSA9IHQuZmluZCgnPScpOwogICAgICAgIHN0cmluZyBhID0gdC5zdWJzdHIoMCwgaSk7CiAgICAgICAgc3RyaW5nIGIgPSB0LnN1YnN0cihpICsgMSk7CgogICAgICAgIGJvb2wgaGFzYSA9IGcuZmluZChhKSAhPSBnLmVuZCgpOwogICAgICAgIGJvb2wgaGFzYiA9IGcuZmluZChiKSAhPSBnLmVuZCgpOwoKICAgICAgICBpZiAoIWhhc2EpIGlkLnB1c2hfYmFjayhhKTsKICAgICAgICBpZiAoIWhhc2IpIGlkLnB1c2hfYmFjayhiKTsKCiAgICAgICAgc3dpdGNoIChoYXNhIDw8IDEgfCBoYXNiKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBnW2JdID0gZ1thXSA9IGcuc2l6ZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGdbYV0gPSBnW2JdOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGdbYl0gPSBnW2FdOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGludCBqID0gbWluKGdbYV0sIGdbYl0pOwogICAgICAgICAgICBpbnQgayA9IG1heChnW2FdLCBnW2JdKTsKICAgICAgICAgICAgZm9yIChhdXRvICZ4IDogZykgaWYgKHguc2Vjb25kID09IGspIHguc2Vjb25kID0gajsKICAgICAgICB9CiAgICB9CgogICAgc2V0PGludD4gczsKICAgIGZvciAoYXV0byAmeCA6IGcpIHMuaW5zZXJ0KHguc2Vjb25kKTsKCiAgICBmb3IgKGludCBpIDogcykgewogICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICAgIGZvciAoYXV0byAmeCA6IGlkKSBpZiAoZ1t4XSA9PSBpKSBjb3V0IDw8IChmaXJzdCA/IGZpcnN0ID0gZmFsc2UsICJbIiA6ICIsICIpIDw8IHg7CiAgICAgICAgY291dCA8PCAiXSIgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]