Given
t1 = {{1, 2}, {3, 4}};
t2 = {{a, b, c}, {e, f}};
I want to add in succession elements of list 2 to list 1 to get:
{{1, 2, a}, {1, 2, b}, {1, 2, c}, {3, 4, e}, {3, 4, f}}
I can do it by:
Flatten[MapThread[Flatten /@ Tuples[{{#1}, #2}] &, {t1, t2}], 1]
as indicated in Thread over list in different levels. This is pretty rough. Any ideas how to do it in a reasonable concise way and easier to understand?

Apply[## &, {t1, t2}, 2]? – kglr Oct 14 '20 at 20:53Thread[{## & @@ #, #2}] &I can't figure out what ##,#, and #2 refer to.Can you explain, please! Sorry for asking dumb questions. – user57467 Oct 17 '20 at 09:26foo = Thread[{## & @@ #, #2}] &is a pure function ( a function with unnamed arguments) that does the same thing as the functionbar[x_,y_] := Thread[{Apply[Sequence][x],y}]. The function##&is the function Sequence, andt he formbuz@@xis the same asApply[buz][x](see Apply). The symbols#(Slot ),#2,`#3,...represent the first, second,third,... arguments supplied to a function. – kglr Oct 17 '20 at 18:35Apply[Sequence]on the first argument, letx={2,4,5};y={u,v};and tryThread[{Apply[Sequence][x],y}]vsThread[{x,y}]. – kglr Oct 17 '20 at 18:40Threadworks on a list of lists. – kglr Oct 17 '20 at 18:44