#include <iostream>
#include <vector>
#include <stdio.h>
#include <climits>

using namespace std;
typedef long long ll;
ll ans = 0;

int countway(int i, int j, vector<vector<bool>> tMb, vector<vector<int>> T,int N) {
	//(i,j)のまわりのマップtMbのfalseのマス目を返す
	int ans = 0;
	if (i - 1 > -1 && !tMb.at(i - 1).at(j)&& T.at(i).at(j)!=T.at(i-1).at(j)) {
		ans++;
	}
	if (i + 1 < N && !tMb.at(i + 1).at(j) && T.at(i).at(j) != T.at(i + 1).at(j)) {
		ans++;
	}
	if (j - 1 > -1 && !tMb.at(i).at(j - 1) && T.at(i).at(j) != T.at(i).at(j - 1)) {
		ans++;
	}
	if (j + 1 < N && !tMb.at(i).at(j + 1) && T.at(i).at(j) != T.at(i).at(j + 1)) {
		ans++;
	}
	return ans;
}

void solve(int i, int j, vector<vector<int>> T, vector<vector<int>> P, vector<vector<bool>> tMb) {
	//今いる点(i,j) マップ全体のタイルの様子T マップ全体の得点の様子P いけるタイルの管理tMb

	tMb.at(i).at(j) = true;
	if (i - 1 > -1 && T.at(i).at(j) == T.at(i - 1).at(j)) {
		tMb.at(i - 1).at(j) = true;
	}
	if (i + 1 < 50 && T.at(i).at(j) == T.at(i + 1).at(j)) {
		tMb.at(i + 1).at(j) = true;
	}
	if (j - 1 > -1 && T.at(i).at(j) == T.at(i).at(j - 1)) {
		tMb.at(i).at(j - 1) = true;
	}
	if (j + 1 < 50 && T.at(i).at(j) == T.at(i).at(j + 1)) {
		tMb.at(i).at(j + 1) = true;
	}
	ans += P.at(i).at(j);

	int next = -1;
	int maxfalse = -1;

	if (j - 1 > -1 && !tMb.at(i).at(j - 1) && (maxfalse < countway(i, j - 1, tMb,T, 50))) {
		maxfalse = countway(i, j-1, tMb, T, 50);
		next = 1;
	}
	if (j + 1 < 50 && !tMb.at(i).at(j + 1) && maxfalse < countway(i, j + 1, tMb, T, 50)) {
		maxfalse = countway(i, j + 1, tMb, T, 50);
		next = 3;
	}
	if (i - 1 > -1 && !tMb.at(i - 1).at(j) && maxfalse < countway(i - 1, j, tMb, T, 50)) {
		maxfalse = countway(i - 1, j, tMb, T, 50);
		next = 2;
	}
	if (i + 1 < 50 && !tMb.at(i + 1).at(j) && maxfalse < countway(i + 1, j, tMb, T, 50)) {
		maxfalse = countway(i + 1, j, tMb, T, 50);
		next = 4;
	}

	if (next == 1) {
		cout << "L";
		solve(i, j - 1, T, P, tMb);
	}
	else if (next == 2) {
		cout << "U";
		solve(i - 1, j, T, P, tMb);
	}
	else if (next == 3) {
		cout << "R";
		solve(i, j + 1, T, P, tMb);
	}
	else if (next == 4) {
		cout << "D";
		solve(i + 1, j, T, P, tMb);
	}
	else {
		return;
	}

}

int main() {
	int si, sj;
	cin >> si >> sj;
	vector<vector<int>> T(50, vector<int>(50));
	vector<vector<int>> P(50, vector<int>(50));


	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			cin >> T.at(i).at(j);
		}
	}

	/*vector<vector<int>> Graph(50,vector<int>(50));

	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			if (i > 0) {
				if (T.at(i).at(j) != T.at(i - 1).at(j)) Graph.at(T.at(i).at(j)).push_back(T.at(i - 1).at(j));
			}
			if (i < 49) {
				if (T.at(i).at(j) != T.at(i + 1).at(j)) Graph.at(T.at(i).at(j)).push_back(T.at(i + 1).at(j));
			}
			if (j > 0) {
				if (T.at(i).at(j) != T.at(i).at(j - 1))Graph.at(T.at(i).at(j)).push_back(T.at(i).at(j - 1));
			}
			if (j < 49) {
				if (T.at(i).at(j) != T.at(i).at(j + 1))Graph.at(T.at(i).at(j)).push_back(T.at(i).at(j + 1));
			}
		}
	}*/

	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			cin >> P.at(i).at(j);
		}
	}

	vector<vector<bool>> tMb(50, vector<bool>(50, false));

	solve(si, sj, T, P, tMb);
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int mex(const vector<int> &a, const int i, const int m){
    for(int ret=0; ret<100; ++ret){
        bool has_value = false;
        for(int j=i; j<i+m; ++j){
            if(a[j] == ret){
                has_value = true;
                break;
            }
        }
        if(!has_value){
            return ret;
        }
    }
    return -1;
}

int solve_naive(const vector<int> &a, const int m){
    int ret=1e9;
    for(int i=0; i<int(a.size() - m); ++i){
        ret = min(ret, mex(a, i, m));
    }
    return ret;
}

int solve(const vector<int> &a, const int m){
    // pos[k] = （最後に a[i] = k となった i ）
    vector<int> pos(a.size(), -1);
    // cnt[k] = （a[i] = k なる i のインターバルの最大値）
    vector<int> cnt(a.size(), 0);
    for(int i=0; i<int(a.size()); ++i){
        cnt[a[i]] = max(cnt[a[i]], i - pos[a[i]]);
        pos[a[i]] = i;
    }
    for(int i=0; i<int(a.size()); ++i){
        if(pos[i] >= 0){
            cnt[i] = max(cnt[i], int(a.size()) - pos[i]);
        }else{
            cnt[i] = 1e9;
        }
    }
    for(size_t i=0; i<a.size(); ++i){
        if(cnt[i] > m){
            return i;
        }
    }
    return a.size();
}

int main(){
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for(int i=0; i<n; ++i) cin >> a[i];
    cout << solve(a, m) << endl;
    //cerr << solve_naive(a, m) << endl;
    return 0;
}