#include <cstdio>
#include <climits>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;

auto process(auto&& inp)
{
	using State = tuple<int, int, vector<int>>;
	//          get<?>:  0,    1,       2
	// 상태 표현: 위치, 마지막으로 이용한 점프, 남은 점프 개수

	map<State, int> min_cost;
	// 다이나믹 프로그래밍(DP) 테이블,
	// sparse하니까(중간중간 빈 칸이 많으니까) 배열 대신 std::map 이용.

	vector<int>&& moves = move(inp.first);
	vector<int>&& costs = move(inp.second);
	int n = costs.size(), m = moves.size();

	// 우선순위 큐 (비용이 최소인 pair<비용, 상태>를 얻기 위해 씀).
	priority_queue<pair<int, State>,
					//first,  second
				   vector<pair<int, State>>,
				   greater<pair<int, State>>> que;
				   // 최소 힙(아래 url에서 찾을 수 있다).
				   // kks227.blog.me/220791188929

	// 시작 상태 (비용: 0, 상태: 0번째 칸(다리 밖), 마지막으로 이용한 점프: 없음(-1), 이용 가능한 점프들 수)
	que.push(make_pair(0, make_tuple(0, -1, moves)));

	// 다익스트라 최단경로 알고리즘
	// kks227.blog.me/220796029558
	while (!que.empty()) {
		auto current = que.top();
		que.pop();
		// 현재 큐에서 가장 작은 비용을 갖는 상태를 꺼냄
		if (current.first > min_cost[current.second]) continue;
		// 이미 끝난 상태(위의 블로그 글 보면 설명 있음)면 넘어가자
		if (get<0>(current.second) + 1 == n) { // 답(마지막 칸을 밟음)을 찾음
			return current.first;
		}
		for (int i = 0; i < m; i++) if (get<1>(current.second) != i) {
						// 마지막으로 이용한 점프가 i가 아니면
			auto next = current; // 지금 상태를 복사해서 다음 상태를 만든다
			if ((get<0>(next.second) += i + 1) >= n) continue;
			// 점프해서 다리 밖으로 나가버리는 경우는 안되고
			if (--get<2>(next.second)[i] < 0) continue;
			// 점프 개수 초과해서 사용할 수 없다(남은 개수가 0인 점프를 이용하면 안된다).
			// 동시에 점프 개수 깎음(-- 연산자).
			get<1>(next.second) = i;
			// 다음 상태에서 마지막으로 이용한 점프는 i
			next.first += costs[get<0>(next.second)];
			// 점프한 칸의 비용을 더해주고
			if (!min_cost.count(next.second) ||
				min_cost[next.second] > next.first) {
				// 다음 상태가 여지껏 방문한 적 없는 상태거나 / 이렇게 가는 비용이 더 저렴하면
				min_cost[next.second] = next.first;
				que.push(next);
				// 비용을 갱신하고 큐에 또 넣는다.
				// 여기서 다른 상태로 또 뻗어나가면 다른 상태도 비용을 깎을 수 있을지 모르니까.
			}
		}
	}

	return -1;
}

auto input()
{
	int n, m;
	scanf("%d%d", &n, &m); // n: length, m: moves
	vector<int> counts(m);
	vector<int> costs(++n);
	for (int i = 0; i < m; i++) scanf("%d", &counts[i]);
	for (int i = 1; i < n; i++) scanf("%d", &costs[i]);
	return make_pair(counts, costs);
}

void output(auto&& ans)
{
	if (ans == -1) puts("My mother is dead.");
	else printf("My mother is fucked by %d different dicks.\n", ans);
}

int main() {
	output(process(input()));
	return 0;
}