#include <bits/stdc++.h>
using namespace std;
int kmp[102], pi[102][28], n, dp[102][102][102], path[102][102][102];
string s, A, B;
void kmpfunc() {
  int now = kmp[0] = -1;
  for (int i = 1; i < n; i++) {
    while (now != -1 && s[now + 1] != s[i]) now = kmp[now];
    (s[now + 1] == s[i]) ? kmp[i] = ++now : kmp[i] = now = -1;
  }
  for (int i = 1; i < n; i++) {
    for (int j = 1; j <= 26; j++) {
      char T = 'A' + j - 1;
      now = kmp[i - 1];
      while (now != -1 && s[now + 1] != T) now = kmp[now];
      (s[now + 1] == T) ? pi[i][j] = now + 1 : pi[i][j] = -1;
    }
  }
}
int solve(int i, int j, int k) {
  if (i == A.size() || j == B.size()) return 0;
  if (dp[i][j][k] != -1) return dp[i][j][k];
  int x = 0, y = 0, z = 0, q = 0, ans = 0;
  if (A[i] == B[j]) {
    if (A[i] == s[k] && k + 1 != n) {
      x = 1 + solve(i + 1, j + 1, k + 1);
    }
    if (A[i] != s[k]) {
      y = 1 + solve(i + 1, j + 1, pi[k][A[i] - 'A' + 1] + 1);
    }
  }
  z = solve(i + 1, j, k);
  q = solve(i, j + 1, k);
  ans = max(max(max(x, y), z), q);
  if (ans) {
    if (ans == x)
      path[i][j][k] = 1;
    else if (ans == y)
      path[i][j][k] = 2;
    else if (ans == z)
      path[i][j][k] = 3;
    else if (ans == q)
      path[i][j][k] = 4;
  }
  return dp[i][j][k] = ans;
}
void print(int i, int j, int k) {
  if (path[i][j][k] == 1) {
    printf("%c", A[i]);
    print(i + 1, j + 1, k + 1);
  } else if (path[i][j][k] == 2) {
    printf("%c", A[i]);
    print(i + 1, j + 1, pi[k][A[i] - 'A' + 1] + 1);
  } else if (path[i][j][k] == 3) {
    print(i + 1, j, k);
  } else if (path[i][j][k] == 4) {
    print(i, j + 1, k);
  } else if (path[i][j][k] == -1) {
    return;
  }
}
int main() {
  memset(pi, -1, sizeof(pi));
  memset(dp, -1, sizeof(dp));
  memset(path, -1, sizeof(path));
  cin >> A >> B >> s;
  n = s.size();
  kmpfunc();
  if (solve(0, 0, 0)) {
    print(0, 0, 0);
    puts("");
  } else
    puts("0");
}
