using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
class Myon
{
public Myon() { }
public static int Main()
{
new Myon().calc();
return 0;
}
int n, m, k;
char[] c;
bool[,] con;
bool[,] con2;
List<int>[] es;
List<int>[] esrev;
List<char>[] cs;
string[] st;
void calc()
{
Scanner cin = new Scanner();
n = cin.nextInt();
m = cin.nextInt();
k = cin.nextInt();
c = new char[n];
for (int i = 0; i < n; i++)
{
c[i] = cin.next()[0];
}
con = new bool[n, n];
int[] a, b;
a = new int[m];
b = new int[m];
for (int i = 0; i < m; i++)
{
a[i] = cin.nextInt() - 1;
b[i] = cin.nextInt() - 1;
con[a[i], b[i]] = true;
}
con2 = (bool[,])con.Clone();
for (int k2 = 0; k2 < n; k2++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
con2[i, j] |= con2[i, k2] & con2[k2, j];
}
}
}
uni = new int[n];
for (int i = 0; i < n; i++)
{
uni[i] = -1;
}
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (con2[i, j] && con2[j, i])
{
connect(i, j);
}
}
}
es = new List<int>[n];
esrev = new List<int>[n];
for (int i = 0; i < n; i++)
{
es[i] = new List<int>();
esrev[i] = new List<int>();
}
int[] count = new int[n];
for (int i = 0; i < m; i++)
{
int groupa = getuni(a[i]);
int groupb = getuni(b[i]);
if (groupa == groupb) continue;
if (!es[groupa].Contains(groupb))
{
es[groupa].Add(groupb);
esrev[groupb].Add(groupa);
count[groupb]++;
}
}
cs = new List<char>[n];
for (int i = 0; i < n; i++)
{
cs[i] = new List<char>();
}
for (int i = 0; i < n; i++)
{
cs[getuni(i)].Add(c[i]);
}
for (int i = 0; i < n; i++)
{
cs[i].Sort();
}
st = new string[n];
for (int i = 0; i < n; i++)
{
st[i] = new string(cs[i].ToArray());
}
string ng = (char)('z' + 1) + "";
Queue<int> q = new Queue<int>();
for (int i = 0; i < n; i++)
{
if (cs[i].Count == 0) continue;
if (count[i] == 0) q.Enqueue(i);
}
string[,] dp = new string[n, k + 1];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < k + 1; j++)
{
dp[i, j] = ng;
}
dp[i, 0] = "";
}
string ret = ng;
while (q.Count != 0)
{
int now = q.Dequeue();
for (int i = k; i >= 0; i--)
{
if (dp[now, i] == ng) continue;
for (int j = 1; i + j < k + 1 && j <= st[now].Length; j++)
{
string nextstring = dp[now, i] + st[now].Substring(0, j);
if (String.CompareOrdinal(nextstring, dp[now, i + j]) < 0)
{
dp[now, i + j] = nextstring;
}
}
}
foreach (var next in es[now])
{
for (int i = 0; i < k + 1; i++)
{
if (String.CompareOrdinal(dp[now, i], dp[next, i]) < 0)
{
dp[next, i] = dp[now, i];
}
}
count[next]--;
if (count[next] == 0) q.Enqueue(next);
}
if (String.CompareOrdinal(dp[now, k], ret) < 0)
{
ret = dp[now, k];
}
}
if (ret == ng) Console.WriteLine(-1);
else Console.WriteLine(ret);
}
int[] uni;
int getuni(int a)
{
if (uni[a] < 0) return a;
else return uni[a] = getuni(uni[a]);
}
bool connect(int a, int b)
{
a = getuni(a);
b = getuni(b);
if (a == b) return false;
if (uni[a] > uni[b])
{
swap(ref a, ref b);
}
uni[a] += uni[b];
uni[b] = a;
return true;
}
//swap
void swap<T>(ref T a, ref T b)
{
T c = a;
a = b;
b = c;
}
}
class Scanner
{
string[] s;
int i;
char[] cs = new char[] { ' ' };
public Scanner()
{
s = new string[0];
i = 0;
}
public string next()
{
if (i < s.Length) return s[i++];
do
{
s = Console.ReadLine().Split(cs, StringSplitOptions.RemoveEmptyEntries);
} while ((s.Length == 1 && s[0] == "") || s.Length == 0);
i = 0;
return s[i++];
}
public int nextInt()
{
return int.Parse(next());
}
public long nextLong()
{
return long.Parse(next());
}
public double nextDouble()
{
return double.Parse(next());
}
}