Each heap entry stores three values: (cost, city, stops_remaining). You pop the cheapest cost first, as always. When you pop state (cost, u, k), you check neighbors of city u. For each neighbor v with edge cost w, you push (cost + w, v, k - 1) onto the heap, but only if k > 0.
If k = 0, you've used all your stops. You can't explore further from this state. You might still find the destination from a different path that used fewer stops.
This runs in time and uses space.