Before you actually solve this problem, we have to make a slight detour to explain a notation we haven't used before.

You're going to want to nest one higher order function call inside another:

map of map

Inside the inner ring, there are two things an empty box might mean, an item from the inner list or an item from the outer list. For example, you want to find all the possible sums of numbers, one from each of two lists:

map of map of +

Your intention here is that the left input of + should be one of 2, 3, or 4; the right input should be one of 50 or 60. But Snap! can't read your mind. What actually happens is that the inner map call puts one of 2, 3, or 4 into both empty input slots, so the only numbers in the result are 4, 6, and 8 (2+2, 3+3, and 4+4).

In this situation you need a way to name the inputs to the two ringed functions. If you click the right arrow at the end of a ring, it looks like this:

map with input name

The orange oval works just like a variable in a script variables block; you can change its name by clicking on it, and you can drag it into the function inside the ring. Now you can nest map blocks and be explicit about which value goes where:

map of map of + with input names

The result is a list of lists, rather than a list of six numbers, but at least they're the right numbers! Flattening the result is left as an exercise for the reader.

The technical term for a function's input names is its formal parameters, or sometimes just "parameters."

☞ Okay, if you're a no-hints person, write menu. Otherwise turn the page.