#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>

//#include <ext/pb_ds/assoc_containe.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
//using namespace __gnu_pbds;

//template <class T> order_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//find_by_orede, order_of_key

#define int long long
#define all(a) (a).begin(), (a).end()

#pragma GCC optimize ("O3")
#pragma GCC target ("avx2")


const int inf = 1e18;

void ans(int t) {
	if (t) cout << "First\n";
	else cout << "Second\n";
	exit(0);
}

vector<int> p, sz;
int get(int v) {
	if (p[v] == -1) return v;
	return p[v] = get(p[v]);
}
void merge(int a, int b) {
	a = get(a);
	b = get(b);
	if (a == b) return;
	if (sz[a] < sz[b]) swap(a, b);
	sz[a] += sz[b];
	p[b] = a;
}

vector<pair<int, int>> cur;
int n, m;

bool f(int start, int i) {
	if (i == n - 1) return ((start >> (n - 1)) & 1);

	if (!f(start, i + 1)) return 1;

	for (int j = 0; j < n; ++j) {
		if (cur[i].second < cur[j].first) start ^= (1 << j);
	}
	if (!f(start, i + 1)) return 1;
	return 0;
}

void solve() {
	 cin >> n >> m;
	

	vector<int> a(n), b(n), c(m);
	for (int i = 0; i < n; ++i) cin >> a[i];
	for (int i = 0; i < n; ++i) {
		cin >> b[i];
		cur.push_back({ a[i], b[i] });
	}
	for (int i = 0; i < m; ++i) {
		cin >> c[i];
		cur.push_back({ c[i], -1 });
	}

	if (n == 0) ans(m & 1);
	sort(all(cur));
	int start = 0;
	int id = 0, t = 1;
	for (auto [a, b] : cur) {
		if (b != -1) {
			start += (1 << id) * t;
			++id;
		}
		t ^= 1;
	}

	ans(f(start, 0));
}

signed main() {
	ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t = 1; //cin >> t;
	while (t--) solve();
}