#include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native )   template <class T = int>   inline T readInt();   inline double readDouble();   inline int readUInt();   inline int readChar();   inline void readWord(char *s);   inline bool readLine(char *s);   inline bool isEof();   inline int getChar();   inline int peekChar();   inline bool seekEof();   inline void skipBlanks();   inline std::string readString();   template <class T>   inline void writeInt(T x, char end = 0, int len = -1);   inline void writeChar(int x);   inline void writeWord(const char *s);   inline void writeDouble(double x, int len = 0);   inline void flush();   static struct buffer_flusher_t {     ~buffer_flusher_t() { flush(); }   } buffer_flusher;   using namespace std;   int n, m, l;   const int MAXN = 1e5 + 42;   int h[MAXN];   string pn[MAXN];   string nn[MAXN];   vector<int> z_function(const string &second) {     int n = second.size();     vector<int> z(n, 0);     for (int i = 1, L = 0, R = 1; i < n; ++i) {       z[i] = min(R - i, z[i - L]);       while (i + z[i] < n && second[i + z[i]] == second[z[i]]) ++z[i];       if (i + z[i] + !z[i] > R) L = i, R = i + z[i] + !z[i];     }     return z;   }   inline bool check(const string &pat, const string &rep) {     int len = rep.size();     for (int i = 0; i < n; ++i) {       string second = pat +  #  + pn[i];       auto tz = z_function(second);       vector<int> z;       for (int j = pat.size() + 1; j < tz.size(); ++j) {         z.push_back(tz[j]);       }       bool have = 0;       int pos_st = 0;       for (int j = 0; j < nn[i].size(); ++j) {         if (have) {           if (j - pos_st + 1 <= len) {             if (nn[i][j] != rep[j - pos_st]) return 0;           } else {             if (nn[i][j] != pn[i][j]) return 0;           }         } else if (z[j] == len) {           have = 1;           pos_st = j;           --j;           continue;         } else {           if (nn[i][j] != pn[i][j]) return 0;         }       }     }     return 1;   }   vector<int> same;   vector<int> dif;   inline pair<string, string> get_strs() {     vector<int> lptr;     vector<int> rptr;     for (int sid : dif) {       string pna = pn[sid];       string nna = nn[sid];       lptr.push_back(5000);       rptr.push_back(-1);       for (int i = 0; i < pna.size(); ++i) {         if (pna[i] != nna[i]) {           lptr.back() = min(lptr.back(), i);           rptr.back() = i;         }       }     }     int lp = lptr[0];     int rp = rptr[0];     cerr << lp <<     << rp << endl;     int ss = dif[0];     while (lp > 0) {       bool flag = 1;       for (int i = 1; i < dif.size(); ++i) {         int sid = dif[i];         if (lptr[i] == 0 || !(pn[sid][lptr[i] - 1] == pn[ss][lp - 1] &&                               nn[sid][lptr[i] - 1] == nn[ss][lp - 1])) {           flag = 0;           break;         }         --lptr[i];       }       if (!flag) break;       --lp;     }     while (rp < pn[ss].size() - 1) {       bool flag = 1;       for (int i = 1; i < dif.size(); ++i) {         int sid = dif[i];         if (rptr[i] == pn[sid].size() - 1 ||             !(pn[sid][rptr[i] + 1] == pn[ss][rp + 1] &&               nn[sid][rptr[i] + 1] == nn[ss][rp + 1])) {           flag = 0;           break;         }         ++rptr[i];       }       if (!flag) break;       ++rp;     }     cerr << lp <<     << rp << endl;     return {pn[ss].substr(lp, rp - lp + 1), nn[ss].substr(lp, rp - lp + 1)};   }   int main() {     n = readInt();     int pos = 0;     for (int i = 0; i < n; ++i) {       pn[i] = readString();     }     for (int i = 0; i < n; ++i) {       nn[i] = readString();       if (nn[i] != pn[i]) {         dif.push_back(i);       } else {         same.push_back(i);       }     }     auto [pat, rep] = get_strs();     if (check(pat, rep)) {       writeWord( YES n );       writeWord(pat.c_str());       writeChar(  n );       writeWord(rep.c_str());       writeChar(  n );     } else {       writeWord( NO n );     }   }   static const int buf_size = 4096;   static unsigned char buf[buf_size];   static int buf_len = 0, buf_pos = 0;   inline string readString() {     const int MAX = 1e6 + 42;     static char buf[MAX];     readWord(buf);     return string(buf);   }   inline bool isEof() {     if (buf_pos == buf_len) {       buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);       if (buf_pos == buf_len) return 1;     }     return 0;   }   inline int getChar() { return isEof() ? -1 : buf[buf_pos++]; }   inline int peekChar() { return isEof() ? -1 : buf[buf_pos]; }   inline bool seekEof() {     int c;     while ((c = peekChar()) != -1 && c <= 32) buf_pos++;     return c == -1;   }   inline void skipBlanks() {     while (!isEof() && buf[buf_pos] <= 32U) buf_pos++;   }   inline int readChar() {     int c = getChar();     while (c != -1 && c <= 32) c = getChar();     return c;   }   inline int readUInt() {     int c = readChar(), x = 0;     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getChar();     return x;   }   template <class T>   inline T readInt() {     int second = 1, c = readChar();     T x = 0;     if (c ==  - )       second = -1, c = getChar();     else if (c ==  + )       c = getChar();     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getChar();     return second == 1 ? x : -x;   }   inline double readDouble() {     int second = 1, c = readChar();     double x = 0;     if (c ==  - ) second = -1, c = getChar();     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getChar();     if (c ==  . ) {       c = getChar();       double coef = 1;       while ( 0  <= c && c <=  9 ) x += (c -  0 ) * (coef *= 1e-1), c = getChar();     }     return second == 1 ? x : -x;   }   inline void readWord(char *second) {     int c = readChar();     while (c > 32) *second++ = c, c = getChar();     *second = 0;   }   inline bool readLine(char *second) {     int c = getChar();     while (c !=   n  && c != -1) *second++ = c, c = getChar();     *second = 0;     return c != -1;   }   static int write_buf_pos = 0;   static char write_buf[buf_size];   inline void writeChar(int x) {     if (write_buf_pos == buf_size)       fwrite(write_buf, 1, buf_size, stdout), write_buf_pos = 0;     write_buf[write_buf_pos++] = x;   }   inline void flush() {     if (write_buf_pos)       fwrite(write_buf, 1, write_buf_pos, stdout), write_buf_pos = 0;   }   template <class T>   inline void writeInt(T x, char end, int output_len) {     if (x < 0) writeChar( - ), x = -x;     char second[24];     int n = 0;     while (x || !n) second[n++] =  0  + x % 10, x /= 10;     while (n < output_len) second[n++] =  0 ;     while (n--) writeChar(second[n]);     if (end) writeChar(end);   }   inline void writeWord(const char *second) {     while (*second) writeChar(*second++);   }   inline void writeDouble(double x, int output_len) {     if (x < 0) writeChar( - ), x = -x;     int t = (int)x;     writeInt(t), x -= t;     writeChar( . );     for (int i = output_len - 1; i > 0; i--) {       x *= 10;       t = std::min(9, (int)x);       writeChar( 0  + t), x -= t;     }     x *= 10;     t = std::min(9, (int)(x + 0.5));     writeChar( 0  + t);   }