#include <bits/stdc++.h>
using namespace std;
int const MAX_CH = 110;
char st1[MAX_CH], st2[MAX_CH], st3[MAX_CH];
int dp[MAX_CH][MAX_CH][MAX_CH];
int new_pref_len[MAX_CH][30];
struct {
  int i, j, k;
  char ad_ch;
} from[MAX_CH][MAX_CH][MAX_CH];
int main() {
  gets(st1);
  int len_1 = (int)strlen(st1);
  gets(st2);
  int len_2 = (int)strlen(st2);
  gets(st3);
  int len_3 = (int)strlen(st3);
  for (int taked = 0; taked < len_3; taked++)
    for (int ch = 0; ch < 26; ch++) {
      string cur;
      for (int j = 0; j < taked; j++) cur += st3[j];
      cur += (char)('A' + ch);
      int mx_pref = 0;
      for (int bg = 0; bg < (int)cur.length(); bg++) {
        int Ok = 1;
        for (int r = 0; r < len_3 && bg + r < (int)cur.length(); r++)
          if (st3[r] != cur[bg + r]) {
            Ok = 0;
            break;
          }
        if (Ok) mx_pref = max(mx_pref, ((int)cur.length()) - bg);
      }
      new_pref_len[taked][ch] = mx_pref;
    }
  for (int i = 0; i < MAX_CH; i++)
    for (int j = 0; j < MAX_CH; j++)
      for (int k = 0; k < MAX_CH; k++) dp[i][j][k] = -1;
  for (int i = 0; i < MAX_CH; i++) {
    dp[i][0][0] = 0;
    dp[0][i][0] = 0;
  }
  for (int i = 1; i <= len_1; i++)
    for (int j = 1; j <= len_2; j++)
      for (int k = 0; k < len_3; k++) {
        if (st1[i - 1] == st2[j - 1]) {
          int new_k;
          if (st3[k] == st1[i - 1])
            new_k = k + 1;
          else
            new_k = new_pref_len[k][st1[i - 1] - 'A'];
          if (new_k >= len_3)
            ;
          else if (dp[i - 1][j - 1][k] + 1 > dp[i][j][new_k]) {
            dp[i][j][new_k] = dp[i - 1][j - 1][k] + 1;
            from[i][j][new_k].i = i - 1;
            from[i][j][new_k].j = j - 1;
            from[i][j][new_k].k = k;
            from[i][j][new_k].ad_ch = st1[i - 1];
          }
        }
        if (dp[i - 1][j][k] > dp[i][j][k]) {
          dp[i][j][k] = dp[i - 1][j][k];
          from[i][j][k].i = i - 1;
          from[i][j][k].j = j;
          from[i][j][k].k = k;
          from[i][j][k].ad_ch = 0;
        }
        if (dp[i][j - 1][k] > dp[i][j][k]) {
          dp[i][j][k] = dp[i][j - 1][k];
          from[i][j][k].i = i;
          from[i][j][k].j = j - 1;
          from[i][j][k].k = k;
          from[i][j][k].ad_ch = 0;
        }
      }
  int cur_i = len_1, cur_j = len_2, cur_k = -1;
  int mx = -1;
  for (int k = 0; k < len_3; k++)
    if (dp[len_1][len_2][k] > mx) {
      mx = dp[len_1][len_2][k];
      cur_k = k;
    }
  if (mx <= 0) {
    printf("0");
    return 0;
  }
  string ans;
  while (cur_i >= 1 && cur_j >= 1) {
    if (from[cur_i][cur_j][cur_k].ad_ch > 0)
      ans += from[cur_i][cur_j][cur_k].ad_ch;
    int new_i = from[cur_i][cur_j][cur_k].i;
    int new_j = from[cur_i][cur_j][cur_k].j;
    int new_k = from[cur_i][cur_j][cur_k].k;
    cur_i = new_i;
    cur_j = new_j;
    cur_k = new_k;
  }
  for (int i = ((int)ans.length()) - 1; i >= 0; i--) printf("%c", ans[i]);
  return 0;
}
