#include <bits/stdc++.h>
using namespace std;
bool ll(const string &a, const string &b) {
  return ((a).size()) < ((b).size());
}
bool pred(const vector<vector<char> > &a, const vector<vector<char> > &b) {
  for (int i = 0; i < ((a).size()) && i < ((b).size()); ++i) {
    bool res = lexicographical_compare((a[i]).begin(), (a[i]).end(),
                                       (b[i]).begin(), (b[i]).end());
    if (res || lexicographical_compare((b[i]).begin(), (b[i]).end(),
                                       (a[i]).begin(), (a[i]).end()))
      return res;
  }
  return false;
}
int main(void) {
  vector<string> str;
  for (int i = (0); i < ((6)); ++i) {
    string tmp;
    getline(cin, tmp);
    str.push_back(tmp);
  }
  sort((str).begin(), (str).end(), ll);
  vector<vector<vector<char> > > cand;
  do {
    for (int i = (0); i < ((4)); ++i) {
      for (int j = (0); j < ((4)); ++j) {
        if (i == j) continue;
        if (str[i][0] != str[j][0]) continue;
        if (str[i][((str[i]).size()) - 1] != str[5][0]) continue;
        if (str[j][((str[j]).size()) - 1] != str[4][0]) continue;
        if (str[j][((str[j]).size()) - 1] != str[4][0]) continue;
        if (((str[4]).size()) < ((str[i]).size()) ||
            ((str[5]).size()) < ((str[j]).size()) ||
            str[4][((str[i]).size()) - 1] != str[5][((str[j]).size()) - 1])
          continue;
        for (int k = (0); k < ((4)); ++k) {
          if (k == i || k == j) continue;
          if (((str[k]).size()) + ((str[j]).size()) - 1 != ((str[5]).size()) ||
              str[k][0] != str[4][((str[4]).size()) - 1])
            continue;
          if (((str[6 - i - j - k]).size()) + ((str[i]).size()) - 1 !=
                  ((str[4]).size()) ||
              str[6 - i - j - k][0] != str[5][((str[5]).size()) - 1])
            continue;
          if (str[k][((str[k]).size()) - 1] !=
              str[6 - i - j - k][((str[6 - i - j - k]).size()) - 1])
            continue;
          vector<vector<char> > cw(((str[5]).size()),
                                   vector<char>(((str[4]).size()), '.'));
          copy((str[i]).begin(), (str[i]).end(), cw[0].begin());
          for (int l = (0); l < ((((str[j]).size()))); ++l)
            cw[l][0] = str[j][l];
          copy((str[4]).begin(), (str[4]).end(),
               cw[((str[j]).size()) - 1].begin());
          for (int l = (0); l < ((((str[5]).size()))); ++l)
            cw[l][((str[i]).size()) - 1] = str[5][l];
          copy((str[6 - i - j - k]).begin(), (str[6 - i - j - k]).end(),
               cw[((str[5]).size()) - 1].begin() + ((str[i]).size()) - 1);
          for (int l = (0); l < ((((str[k]).size()))); ++l)
            cw[l + ((str[j]).size()) - 1][((str[4]).size()) - 1] = str[k][l];
          cand.push_back(cw);
          vector<vector<char> > scw(((str[4]).size()),
                                    vector<char>(((str[5]).size()), '.'));
          for (int l = (0); l < ((((str[5]).size()))); ++l)
            for (int m = (0); m < ((((str[4]).size()))); ++m)
              scw[m][l] = cw[l][m];
          cand.push_back(scw);
        }
      }
    }
  } while (next_permutation(str.begin() + 2, str.end(), ll));
  if (!((cand).size())) {
    cout << "Impossible";
    return 0;
  }
  vector<vector<vector<char> > >::iterator it =
      min_element((cand).begin(), (cand).end(), pred);
  for (int i = (0); i < ((((*it).size()))); ++i) {
    copy(((*it)[i]).begin(), ((*it)[i]).end(),
         ostream_iterator<char>(cout, ""));
    cout << endl;
  }
}
