#include <bits/stdc++.h>
#include <ext/rope>

using namespace std;
using namespace __gnu_cxx;

rope<int> forv, rev, one, two, init;
string s;

void fail()
{
	cout << "Bad Luck Allen\n";
	exit(0);
}

const int maxn = 1e5 + 7, sigma = 26;

int p[maxn];
int assigned[maxn];

int get(int v)
{
	if(p[v] == v) return v;
	return p[v] = get(p[v]);
}

void uni(int a, int b)
{
	a = get(-a);
	b = get(-b);
	if(assigned[a] && assigned[b])
		if(assigned[a] != assigned[b])
			fail();
	if(assigned[a])
		assigned[b] = assigned[a];
	p[a] = b;
}

void assig(int a, int b)
{
	a = get(-a);
	if(assigned[a] && assigned[a] != b)
		fail();
	assigned[a] = b;
}

int main()
{
	//freopen("input.txt", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0);
    iota(p, p + maxn, 0);
    int64_t n, m, k;
    cin >> n >> m >> k;
    cin >> s;
    int cnt = 0;
    for(int i = 0; i < n; i++)
		if(s[i] == '?')
			forv.push_back(--cnt);
		else
			forv.push_back(s[i]);
	
    for(int i = n - 1; i >= 0; i--)
		if(s[i] == '?')
			rev.push_back(cnt++);
		else
			rev.push_back(s[i]);
    init = forv;
	while(m--)
	{
		int l, r;
		cin >> l >> r;
		l--, r--;
		
        one = forv.substr(l, r - l + 1);
        two = rev.substr(n - r - 1, r - l + 1);
        
        forv.erase(l, r - l + 1);
        rev.erase(n - r - 1, r - l + 1);
        
        forv.insert(l, two);
        rev.insert(n - r - 1, one);
	}
    for(int i = 0; i < n; i++)
		if(init[i] != forv[i])
		{
			if(init[i] > 0 && forv[i] > 0)
				fail();
			if(init[i] < 0 && forv[i] < 0)
				uni(init[i], forv[i]);
			if(init[i] > 0)
				assig(forv[i], init[i]);
			if(forv[i] > 0)
				assig(init[i], forv[i]);
		}
	vector<int> represent;
    k--;
	while(k)
	{
		represent.push_back(k % sigma);
		k /= sigma;
	}
	for(int i = 0; i < n; i++)
		if(init[i] < 0 && !assigned[get(-init[i])] && get(-init[i]) == -init[i])
			cnt++;
    if(represent.size() > cnt)
        fail();
    string ans;
    for(int i = 0; i < n; i++)
    {
        if(init[i] > 0)
			ans.push_back(char(init[i]));
		else if(assigned[get(-init[i])])
			ans.push_back(assigned[get(-init[i])]);
		else if(cnt > represent.size())
		{
			assig(init[i], 'a');
			ans.push_back('a');
			cnt--;
		}
		else
		{
			assig(init[i], 'a' + represent[cnt - 1]);
			ans.push_back('a' + represent[cnt - 1]);
			cnt--;
		}
    }
    cout << ans << "\n";
    return 0;
}
