A sixth-century post-Roman kingdom called Urland is being terrorized by a 400-year-old dragon named Vermithrax Pejorative. To appease the dragon, King Casiodorus (Peter Eyre) offers it virgin girls selected by lottery twice a year. An expedition led by a young man called Valerian (Clarke) seeks the last sorcerer, Ulrich of Craggenmoor (Richardson), for help. A brutish soldier from Urland named Tyrian (Hallam), who has followed the expedition, intimidates the wizard. Ulrich invites Tyrian to stab him to prove his magical powers. Tyrian does so and Ulrich dies instantly, to the horror of his young apprentice Galen Bradwarden (MacNicol) and his elderly servant Hodge (Sydney Bromley). Hodge cremates Ulrich's body and places the ashes in a leather pouch, informing Galen that Ulrich wanted his ashes spread over a lake of burning water.
Galen inherits the wizard's magical amulet, and takes it upon himself to journey to Urland. On the way, he discovers Valerian is really a young woman, who disguised herself to avoid being selected in the lottery. In an effort to discourage the expedition, Tyrian kills Hodge; before dying, he hands Galen the pouch and dies with the words "Burning water..." on his lips.
Arriving in Urland, Galen inspects the dragon's lair and attempts to seal its entrance by causing rocks to fall from the cliff. Tyrian apprehends Galen and takes him to the court of King Casiodorus. King Casiodorus guesses that Galen is not a real wizard and complains that his attack may have angered the dragon instead of killing it, as his own brother and predecessor once did. The king confiscates the amulet and imprisons Galen. His daughter Elspeth (Chloe Salaman) comes to taunt Galen, but is shocked when he informs her of rumours that the lottery is rigged to exclude her name and those who are rich enough to pay to have their children' names removed. Casiodorus is unable to lie convincingly when she confronts him regarding this.
Meanwhile, the dragon frees itself from its prison and causes an earthquake. Galen narrowly escapes, but without the amulet. The village priest, Brother Jacopus (Ian McDiarmid), leads his congregation to confront the dragon, denouncing it as the Devil, but the dragon incinerates him and then heads for the village, burning all in its path.
When the lottery begins anew, Princess Elspeth rigs the draw so that only her name can be chosen. The King returns the amulet to Galen so that he might save Elspeth. Galen uses the amulet to enchant a heavy spear that had been forged by Valerian's father (which he had dubbed Sicarius Dracorum, or "Dragonslayer") with the ability to pierce the dragon's armored hide. Meanwhile, Valerian gathers some molted dragon scales and uses them to make Galen a shield, and the two realize they have romantic feelings for each other. As Galen attempts to rescue Princess Elspeth, he fights and kills Tyrian. The Princess, determined to make amends for all the girls whose names had been chosen in the past, descends into the dragon's cave and to her death. Galen follows her and finds a brood of young dragons feasting on her corpse. He kills them and finds Vermithrax nesting by an underground lake of fire. He manages to wound the monster but the spear is broken. Only Valerian's shield saves him from incineration.
After his failure to kill Vermithrax, Valerian convinces Galen to leave the village with her. As the two lovers prepare to leave, the amulet gives Galen a vision that explains his teacher's final wishes. Ulrich had asked that his ashes be spread over "burning water", and Galen realizes that the wizard had planned his own death and cremation after realizing he was not physically able to make the journey by himself. He used Galen to deliver him to Urland. Galen returns to the cave. When the ashes are spread over the lake, the wizard is resurrected within the flames. Ulrich reveals that his time is short and that Galen must destroy the amulet when the time is right. The wizard then transports himself to the mountaintop and confronts the dragon. After a brief battle, the monster grabs the old man and flies away with him. Galen crushes the amulet with a rock, causing the wizard to explode and kill the dragon, whose corpse falls out of the sky.
Inspecting the wreckage, the villagers credit God with the victory. The king arrives and drives a sword into the dragon's broken carcass to claim the glory for himself. As Galen and Valerian leave Urland together, he confesses that he misses both Ulrich and the amulet. He says "I just wish we had a horse," and a white horse appears to take the incredulous lovers away.

Question: Who really kill the dragon?
Answer: the wizard Ulrich and his apprentice Galen
Alternative answer: Galen.