/*
*/

//#pragma comment(linker, "/STACK:16777216")
#define _CRT_SECURE_NO_WARNINGS

#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <assert.h>

#define y0 sdkfaslhagaklsldk
#define y1 aasdfasdfasdf
#define yn askfhwqriuperikldjk
#define j1 assdgsdgasghsf
#define tm sdfjahlfasfh
#define lr asgasgash
#define norm asdfasdgasdgsd

#define eps 1e-9
#define M_PI 3.141592653589793
#define bs 1000000007
#define bsize 256

using namespace std;

const int INF = 1e9;
const int N = 200;

string st;

vector<string> v;

bool contains(string a, string b)
{
	int ptr = 0;
	for (int i = 0; i < a.size(); i++)
	{
		if (ptr < b.size() && b[ptr] == a[i])
			++ptr;
	}
	return (ptr == b.size());
}

bool check(string res, vector<string> v)
{
	for (int i = 0; i < v.size(); i++)
	{
		if (!contains(res, v[i]))
			return false;
	}
	return true;
}

bool cmp0(string&a, string&b)
{
	if (a.size() != b.size())
		return a.size() > b.size();
	return a < b;
}

bool cmp1(string&a, string&b)
{
	return a < b;
}

vector<int> entries[N];

int sz;

string solve(vector<string> v, int cmp_flag)
{
	if (cmp_flag == 0)
		sort(v.begin(), v.end(), cmp0);
	else
		random_shuffle(v.begin(), v.end());
	/*
	for (int i = 0; i < v.size(); i++)
	{
	cout << v[i] << endl;
	}
	*/
	for (int i = 'a'; i <= 'z'; i++)
	{
		entries[i].clear();
	}

	string res = "";

	res = "";
	sz = 0;

	for (int i = 0; i < v.size(); i++)
	{
		int ptr = -1;
		for (int j = 0; j < v[i].size(); j++)
		{
			int need = v[i][j];
			int id = upper_bound(entries[need].begin(), entries[need].end(), ptr) - entries[need].begin();
			if (id == entries[need].size())
			{
				entries[need].push_back(sz);
				ptr = sz;
				++sz;
				res += char(need);
			}
			else
			{
				ptr = entries[need][id];
			}
		}
	}
	return res;
}

int used[1000];

string solve_smart(vector<string> v)
{
	string res;

	for (int i = 0;; i++)
	{
		for (int j = 0; j < 256; j++)
		{
			used[j] = 0;
		}
		int flag = 0;
		for (int j = 0; j < v.size(); j++)
		{
			if (v[j].size()>i)
				used[v[j][i]] = 1,
				flag = 1;
		}
		if (flag == 0)
			break;
		for (int j = 0; j < 256;j++)
		if (used[j])
			res += char(j);
	}
	return res;
}
int main(){
	//freopen("fabro.in","r",stdin);
	//freopen("fabro.out","w",stdout);
	//freopen("F:/in.txt", "r", stdin);
	//freopen("F:/output.txt", "w", stdout);
	ios_base::sync_with_stdio(0);
	//cin.tie(0);

	while (cin >> st)
	{
		if (st == ".")
			break;
		v.push_back(st);
	}

	string res = solve(v, 0);
	for (int iter = 1; iter <= 4; iter++)
	{
		string res2 = solve(v, 1);
		if (res2.size() < res.size())
			res = res2;
	}
	string res2 = solve_smart(v);
	if (res2.size() < res.size())
		res = res2;
	cout << res << endl;

	//	cout << res.size() << " " << check(res, v) << endl;

	cin.get(); cin.get();
	return 0;
}