#include <bits/stdc++.h>
using namespace std;
const int mx = 110;
char s[mx], t[mx], v[mx];
int p[mx][mx];
int f[mx][mx][mx], fr[mx][mx][mx];
void dfs(int ls, int lt, int ans) {
  if (fr[ls][lt][ans] == -1) return;
  if (fr[ls][lt][ans] == -2)
    dfs(ls - 1, lt, ans);
  else if (fr[ls][lt][ans] == -3)
    dfs(ls, lt - 1, ans);
  else {
    dfs(ls - 1, lt - 1, fr[ls][lt][ans]);
    putchar(s[ls]);
  }
}
int main() {
  while (scanf("%s%s%s", s + 1, t + 1, v + 1) != EOF) {
    int ls = strlen(s + 1), lt = strlen(t + 1), lv = strlen(v + 1);
    for (int i = 1; i <= lv; i++)
      for (int j = 0; j < 26; j++)
        if (v[p[i - 1][v[i] - 'A'] + 1] - 'A' == j)
          p[i][j] = p[i - 1][v[i] - 'A'] + 1;
        else
          p[i][j] = p[p[i - 1][v[i] - 'A']][j];
    memset(fr, -1, sizeof(fr));
    memset(f, 0, sizeof(f));
    for (int i = 0; i <= ls; i++)
      for (int j = 0; j <= lt; j++)
        for (int k = 0; k < lv; k++) {
          if (f[i][j][k] > f[i + 1][j][k]) {
            f[i + 1][j][k] = f[i][j][k];
            fr[i + 1][j][k] = -2;
          }
          if (f[i][j][k] > f[i][j + 1][k]) {
            f[i][j + 1][k] = f[i][j][k];
            fr[i][j + 1][k] = -3;
          }
          if (s[i + 1] == t[j + 1]) {
            int pos = v[k + 1] == s[i + 1] ? k + 1 : p[k][s[i + 1] - 'A'];
            if (f[i][j][k] + 1 > f[i + 1][j + 1][pos]) {
              f[i + 1][j + 1][pos] = f[i][j][k] + 1;
              fr[i + 1][j + 1][pos] = k;
            }
          }
        }
    int ans = 0;
    for (int i = 1; i < lv; i++)
      if (f[ls][lt][i] > f[ls][lt][ans]) ans = i;
    dfs(ls, lt, ans);
    !f[ls][lt][ans] ? puts("0") : puts("");
  }
  return 0;
}
