It was the Kylian Mbappe show on Wednesday. The teenage sensation led AS Monaco past Borussia Dortmund with a goal and a major impact in the rest of the match as his team won the second leg of its Champions League quarterfinal tie, 3-1. That cemented a 6-3 aggregate victory, giving Monaco a well-earned semifinal berth as a team that none of the other semifinalists want to face in its current form.

Everyone’s eyes were on Mbappe coming into this match, and he certainly didn’t disappoint. He scored just minutes into the match with a high-quality finish on a rebound from a sloppy save by Borussia Dortmund keeper Roman Bürki. The run he’d made during the setup to the preceding shot had thrown Dortmund’s defense into chaos, and he took full advantage of that disarray to slide into position to pounce on the rebound to give his team a big advantage in the match.

From there, it was all Mbappe, all the time. Even when he wasn’t on the ball when Monaco were surging forward on counterattacks, Dortmund were focusing heavily on him — often to little result, with his quick changes in direction throwing their midfielders and defenders into fits. It wasn’t even 15 minutes before Monaco scored a second goal to take a commanding 5-2 aggregate lead, and while Mbappe neither scored nor registered the assist — it was Falcao heading home a cross from Thomas Lemar that put Monaco on the scoresheet again — it was Dortmund overreacting to an off-the-ball run from Mbappe that cleared things up for Monaco to score.

That would be the tune of much of the first half, though Dortmund finally did manage to assert a degree of control in the match to limit Monaco’s chances to get forward on the counter. A clever halftime change gave them a bit more of an aggressive presence in midfield, taking Nuri Sahin out for a fullback in Marcel Schmelzer and sliding Raphaël Guerreiro into Sahin’s place in the pivot. The moves paid quick dividends through a Marco Reus volleyed goal in the 48th minute, taking advantage of Monaco being slow to respond to that tactical adjustment.

Once Monaco did adjust, though, Dortmund found the going tough once more, struggling badly to break down Monaco’s defense. The performance in front of goal from both Kamil Glik and Jemerson was tremendous, keeping a huge attacking threat in Pierre-Emerick Aubameyang almost completely quiet aside from a couple of missed opportunities in the first half.

Mbappe was given a hero’s ovation by the fans when he was substituted in the 81st minute, having continued to make a profound impact on the match throughout his time on it. It was the man who replaced him, though, who put the final nail in Dortmund’s coffin, with Valere Germain scoring on literally his first touch as he got free on a bad breakdown in the German defense on a counterattack just moments after coming onto the pitch.

The result is a massive one for AS Monaco, who have now proved to the world that they can hang with and beat just about any team in Europe. They took down a team with powerhouse talent in Manchester City to get here, and they controlled and out-paced a team with a top-shelf attack in Borussia Dortmund to make the semifinal. None of the three teams they can be drawn with will be eager to face them, because while on paper they’ll be the weakest of the four teams, they cannot be taken lightly by any means, and can easily put in a performance to beat any of their rivals.

AS Monaco: Danijel Subasic; Benjamin Mendy, Kamil Glik, Jemerson, Almamy Toure; João Moutinho, Tiemoué Bakayoko; Bernardo Silva (Andrea Raggi 90’), Thomas Lemar, Kylian Mbappe (Valere Germain 81’); Falcao (Nabil Dirar 68’)

Goals: Mbappe (3’), Falcao (17’), Germain (81’)

Borussia Dortmund: Roman Bürki; Lukasz Piszczek, Matthias Ginter, Sokratis, Raphaël Guerreiro (Christian Pulisic 72’); Julian Weigl, Nuri Sahin (Marcel Schmelzer 46’); Marco Reus, Shinji Kagawa, Erik Durm (Ousmane Dembele 27’); Pierre-Emerick Aubameyang

Goals: Reus (48’)

Three things we learned

Monaco are going to make a ton of money on Kylian Mbappe

It’s entirely possible that we see the transfer fee record fall again this summer because of young Kylian Mbappe, with gigantic clubs lining up and his fee rising with every clutch goal scored. It’s one thing to score goals in bunches in Ligue 1, but at this point the 18-year-old French international has shown that he has everything he needs to score regularly at any level after his successes this season in the Champions League.

The fact that an 18-year-old is this good is ludicrous, but it’s getting harder and harder to hedge around the fact that Mbappe is just as good as he looks. And while it would normally be hard to say that a player is worth breaking the transfer record for — a record that currently stands at €105 million after Paul Pogba’s move to Manchester United last summer — seeing such a young player that you can easily tie down for a long, long time makes making such an investment much, much easier.

It will be a shame to see Mbappe and other exciting talents leave Monaco this summer after creating such an entertaining team this season, but the team needs the money if they’re going to stay competitive. Given what they’ve been able to do with relatively limited resources the last few years, it’s going to be interesting to see what comes next for this team. In the meantime, though, hopefully we’ll get to see Monaco keep entertaining us in the Champions League semifinal — and maybe even in the final.

Borussia Dortmund need a stronger defense to compete at this level

Dortmund have one of the best attacks in Europe, but their defense has held them back in a bad way at times this season. They don’t have a bad defense by any means — Sokratis is a fine defender, Marc Bartra is OK most of the time when he’s healthy, Matthias Ginter is a good young player, and Raphaël Guerreiro is a great up-and-comer — but they lack that high-impact, lockdown defender to really help lead the line in big matches against high-quality opponents.

That lacking showed up in a big way on both of Monaco’s early goals, with Sokratis and Ginter both doing yeoman’s work to try and stop play, but lacking that killer instinct to really step in and blow up a play. It also doesn’t help that Roman Bürki is a thoroughly average goalkeeper who seems to be forming a habit of falling short of expectations in big matches — Dortmund will likely need to improve in goal as well if they want to take a big step forward as a club, because you’re not going anywhere without a goalkeeper who can live up to the occasion.

Don’t overlook Bernardo Silva

It’s easy to get lost in the shiny light of Mbappe, but Monaco have another young attacker who you need to pay attention to in Bernardo Silva. The 22-year-old Portuguese winger played an instrumental role in this match, consistently beating his man on the wing to get into the final third and either send in a dangerous ball or make a run to the far post to disrupt Dortmund’s defense and give his fellow attackers another option. He played at an extremely high level in this match, which shouldn’t be a surprise to those who have followed him in the last couple of years.

Silva isn’t the flashiest player around, but his steady hand and silky quality can play with just about any team in Europe, and while huge clubs are lining up for Mbappe, most of them will be asking about his creative teammate as well. He has the potential to become if not an elite player in Europe, a major part of the tier of players right behind the elite. He’s been a huge part of Monaco’s success the last couple of years, and he’s only just getting started as a player.