#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF (1<<29) #define rep(i,n) for(int i=0;i<(int)(n);i++) #define all(v) v.begin(),v.end() #define uniq(v) v.erase(unique(all(v)),v.end()) int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; if (n > 52) { cout << "Impossible" << endl; return 0; } string u[52]; rep(i, n)cin >> u[i]; map> mp; bool b[52] = {}; rep(i, n) { mp[u[i].substr(0, 1)].insert(i); mp[u[i].substr(1, 2)].insert(i); } std::random_device rnd; std::mt19937 mt(rnd()); vector overlap; rep(i, 114514) { overlap.clear(); for (auto p : mp) { if (p.second.size() > 1) { for (int a : p.second)overlap.push_back(a); } } if (overlap.empty())break; sort(all(overlap)); uniq(overlap); int idx = overlap[mt() % overlap.size()]; if (b[idx]) { mp[u[idx].substr(0, 2)].erase(idx); mp[u[idx].substr(2, 1)].erase(idx); mp[u[idx].substr(0, 1)].insert(idx); mp[u[idx].substr(1, 2)].insert(idx); } else { mp[u[idx].substr(0, 1)].erase(idx); mp[u[idx].substr(1, 2)].erase(idx); mp[u[idx].substr(0, 2)].insert(idx); mp[u[idx].substr(2, 1)].insert(idx); } b[idx] = !b[idx]; } if (overlap.empty()) { rep(i,n) { if (b[i]) { cout << u[i].substr(0, 2) << ' ' << u[i].substr(2, 1) << endl; } else { cout << u[i].substr(0, 1) << ' ' << u[i].substr(1, 2) << endl; } } } else { cout << "Impossible" << endl; } return 0; }