#include <bits/stdc++.h>
using namespace std;
const int MAXN = (107);
const int inf = (int)1e9 + 42;
struct aho_corasick {
  int is_end[MAXN], link[MAXN], psz;
  map<char, int> to[MAXN];
  void clear() {
    for (int i = 0; i < psz; i++) is_end[i] = 0, link[i] = 0, to[i].clear();
    psz = 1;
    is_end[0] = 1;
  }
  aho_corasick() {
    psz = MAXN - 2;
    clear();
  }
  void add_word(string s) {
    int u = 0;
    for (char c : s) {
      if (!to[u].count(c)) to[u][c] = psz++;
      u = to[u][c];
    }
    is_end[u] = 1;
  }
  void push_links() {
    queue<int> Q;
    int u, v, j;
    char c;
    Q.push(0);
    link[0] = -1;
    while (!Q.empty()) {
      u = Q.front();
      Q.pop();
      for (auto it : to[u]) {
        v = it.second;
        c = it.first;
        j = link[u];
        while (j != -1 && !to[j].count(c)) j = link[j];
        if (j != -1)
          link[v] = to[j][c];
        else
          link[v] = 0;
        Q.push(v);
      }
    }
  }
};
int n, m;
string s1, s2, virus;
void read() {
  cin >> s1;
  cin >> s2;
  cin >> virus;
  n = s1.size();
  m = s2.size();
}
aho_corasick aho;
bool is_bad[MAXN];
int dp[MAXN][MAXN][MAXN];
int nxt_i[MAXN][MAXN][MAXN];
int nxt_j[MAXN][MAXN][MAXN];
int nxt_state[MAXN][MAXN][MAXN];
int rec(int i, int j, int state) {
  if (i >= n + 1) return -inf;
  if (j >= m + 1) return -inf;
  if (is_bad[state]) return -inf;
  if (i == n && j == m) return 0;
  int &memo = dp[i][j][state];
  if (memo != -1) return memo;
  memo = -inf;
  if (i < n && j < m && s1[i] == s2[j]) {
    int u = state;
    while (u != -1 && !aho.to[u].count(s1[i])) u = aho.link[u];
    if (u == -1)
      u = 0;
    else
      u = aho.to[u][s1[i]];
    memo = max(memo, 1 + rec(i + 1, j + 1, u));
    nxt_state[i][j][state] = u;
    nxt_i[i][j][state] = i + 1;
    nxt_j[i][j][state] = j + 1;
  }
  if (memo < rec(i + 1, j, state)) {
    memo = max(memo, rec(i + 1, j, state));
    nxt_state[i][j][state] = state;
    nxt_i[i][j][state] = i + 1;
    nxt_j[i][j][state] = j;
  }
  if (memo < rec(i, j + 1, state)) {
    memo = max(memo, rec(i, j + 1, state));
    nxt_state[i][j][state] = state;
    nxt_i[i][j][state] = i;
    nxt_j[i][j][state] = j + 1;
  }
  return memo;
}
void solve() {
  aho.clear();
  aho.add_word(virus);
  aho.push_links();
  int u = 0;
  for (char c : virus) u = aho.to[u][c];
  is_bad[u] = true;
  for (int i = 0; i < aho.psz; i++) {
    int u = i;
    while (u != -1) {
      is_bad[i] |= is_bad[u];
      u = aho.link[u];
    }
  }
  memset(dp, -1, sizeof(dp));
  int ret = rec(0, 0, 0);
  if (!ret)
    cout << 0 << '\n';
  else {
    string ans = "";
    int c_i = 0, c_j = 0, c_state = 0, last_i, last_j, last_state;
    while (!(c_i == n && c_j == m)) {
      last_i = c_i;
      last_j = c_j;
      last_state = c_state;
      c_i = nxt_i[last_i][last_j][last_state];
      c_j = nxt_j[last_i][last_j][last_state];
      c_state = nxt_state[last_i][last_j][last_state];
      if (c_i - last_i && c_j - last_j) ans.push_back(s1[last_i]);
    }
    cout << ans << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  read();
  solve();
  return 0;
}
