#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
vector< string> Explode_L( const string & str, const string & d) {
int s = 0 ;
int i = 0 ;
int j;
vector< string> res;
while ( i + d.size ( ) - 1 < str.size ( ) ) {
for ( j= 0 ; j< ( d.size ( ) ) ; j++ ) {
if ( str[ i+ j] ! = d[ j] ) {
break ;
}
}
if ( j ! = d.size ( ) ) {
i++ ;
continue ;
}
res.push_back ( str.substr ( s, i- s) ) ;
s = ( i + = d.size ( ) ) ;
}
res.push_back ( str.substr ( s) ) ;
return res;
}
string Implode_L( const vector< string> & v, const string & d) {
int i;
string res;
if ( v.size ( ) == 0 ) {
return res;
}
res + = v[ 0 ] ;
for ( i= ( 1 ) ; i< ( v.size ( ) ) ; i++ ) {
res + = d;
res + = v[ i] ;
}
return res;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
vector< string> beforeAndAfterPuzzles( vector< string> & in) {
int i;
int j;
int k;
int N;
vector< string> a;
vector< string> b;
set< string> s;
set< string> :: iterator it;
vector< string> res;
N = in.size ( ) ;
for ( i= 0 ; i< ( N) ; i++ ) {
for ( j= 0 ; j< ( N) ; j++ ) {
if ( i! = j) {
a = Explode_L( in[ i] , " " ) ;
b = Explode_L( in[ j] , " " ) ;
if ( a[ a.size ( ) - 1 ] == b[ 0 ] ) {
for ( k= ( 1 ) ; k< ( b.size ( ) ) ; k++ ) {
a.push_back ( b[ k] ) ;
}
s.insert ( Implode_L( a, " " ) ) ;
}
}
}
}
for ( it= s.begin ( ) ; it! = s.end ( ) ; it++ ) {
res.push_back ( * it) ;
}
return res;
}
}
;
// cLay varsion 20190914-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// vector<string> beforeAndAfterPuzzles(vector<string>& in) {
// int i, j, k, N;
// vector<string> a, b;
// set<string> s;
// set<string>::iterator it;
// vector<string> res;
//
// N = in.size();
// rep(i,N) rep(j,N) if(i!=j){
// a = Explode(in[i], " ");
// b = Explode(in[j], " ");
// if(a[a.size()-1] == b[0]){
// rep(k,1,b.size()) a.push_back(b[k]);
// s.insert( Implode(a, " ") );
// }
// }
//
// for(it=s.begin(); it!=s.end(); it++) res.push_back(*it);
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZlY3RvcjxzdHJpbmc+IEV4cGxvZGVfTChjb25zdCBzdHJpbmcgJnN0ciwgY29uc3Qgc3RyaW5nICZkKXsKICBpbnQgcyA9IDA7CiAgaW50IGkgPSAwOwogIGludCBqOwogIHZlY3RvcjxzdHJpbmc+IHJlczsKICB3aGlsZShpICsgZC5zaXplKCkgLSAxIDwgc3RyLnNpemUoKSl7CiAgICBmb3Ioaj0wO2o8KGQuc2l6ZSgpKTtqKyspewogICAgICBpZihzdHJbaStqXSAhPSBkW2pdKXsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYoaiAhPSBkLnNpemUoKSl7CiAgICAgIGkrKzsKICAgICAgY29udGludWU7CiAgICB9CiAgICByZXMucHVzaF9iYWNrKHN0ci5zdWJzdHIocywgaS1zKSk7CiAgICBzID0gKGkgKz0gZC5zaXplKCkpOwogIH0KICByZXMucHVzaF9iYWNrKHN0ci5zdWJzdHIocykpOwogIHJldHVybiByZXM7Cn0Kc3RyaW5nIEltcGxvZGVfTChjb25zdCB2ZWN0b3I8c3RyaW5nPiAmdiwgY29uc3Qgc3RyaW5nICZkKXsKICBpbnQgaTsKICBzdHJpbmcgcmVzOwogIGlmKHYuc2l6ZSgpPT0wKXsKICAgIHJldHVybiByZXM7CiAgfQogIHJlcyArPSB2WzBdOwogIGZvcihpPSgxKTtpPCh2LnNpemUoKSk7aSsrKXsKICAgIHJlcyArPSBkOwogICAgcmVzICs9IHZbaV07CiAgfQogIHJldHVybiByZXM7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgdmVjdG9yPHN0cmluZz4gYmVmb3JlQW5kQWZ0ZXJQdXp6bGVzKHZlY3RvcjxzdHJpbmc+JiBpbil7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBpbnQgTjsKICAgIHZlY3RvcjxzdHJpbmc+IGE7CiAgICB2ZWN0b3I8c3RyaW5nPiBiOwogICAgc2V0PHN0cmluZz4gczsKICAgIHNldDxzdHJpbmc+OjppdGVyYXRvciBpdDsKICAgIHZlY3RvcjxzdHJpbmc+IHJlczsKICAgIE4gPSBpbi5zaXplKCk7CiAgICBmb3IoaT0wO2k8KE4pO2krKyl7CiAgICAgIGZvcihqPTA7ajwoTik7aisrKXsKICAgICAgICBpZihpIT1qKXsKICAgICAgICAgIGEgPUV4cGxvZGVfTChpbltpXSwgIiAiKTsKICAgICAgICAgIGIgPUV4cGxvZGVfTChpbltqXSwgIiAiKTsKICAgICAgICAgIGlmKGFbYS5zaXplKCktMV0gPT0gYlswXSl7CiAgICAgICAgICAgIGZvcihrPSgxKTtrPChiLnNpemUoKSk7aysrKXsKICAgICAgICAgICAgICBhLnB1c2hfYmFjayhiW2tdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzLmluc2VydChJbXBsb2RlX0woYSwgIiAiKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IoaXQ9cy5iZWdpbigpOyBpdCE9cy5lbmQoKTsgaXQrKyl7CiAgICAgIHJlcy5wdXNoX2JhY2soKml0KTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMTkwOTE0LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgdmVjdG9yPHN0cmluZz4gYmVmb3JlQW5kQWZ0ZXJQdXp6bGVzKHZlY3RvcjxzdHJpbmc+JiBpbikgewovLyAgICAgaW50IGksIGosIGssIE47Ci8vICAgICB2ZWN0b3I8c3RyaW5nPiBhLCBiOwovLyAgICAgc2V0PHN0cmluZz4gczsKLy8gICAgIHNldDxzdHJpbmc+OjppdGVyYXRvciBpdDsKLy8gICAgIHZlY3RvcjxzdHJpbmc+IHJlczsKLy8gCi8vICAgICBOID0gaW4uc2l6ZSgpOwovLyAgICAgcmVwKGksTikgcmVwKGosTikgaWYoaSE9ail7Ci8vICAgICAgIGEgPSBFeHBsb2RlKGluW2ldLCAiICIpOwovLyAgICAgICBiID0gRXhwbG9kZShpbltqXSwgIiAiKTsKLy8gICAgICAgaWYoYVthLnNpemUoKS0xXSA9PSBiWzBdKXsKLy8gICAgICAgICByZXAoaywxLGIuc2l6ZSgpKSBhLnB1c2hfYmFjayhiW2tdKTsKLy8gICAgICAgICBzLmluc2VydCggSW1wbG9kZShhLCAiICIpICk7Ci8vICAgICAgIH0KLy8gICAgIH0KLy8gCi8vICAgICBmb3IoaXQ9cy5iZWdpbigpOyBpdCE9cy5lbmQoKTsgaXQrKykgcmVzLnB1c2hfYmFjaygqaXQpOwovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==