Generate a Python program that has the following intention:

The program defines a function p1 that takes three arguments: height, start, and end. height represents the number of steps required to reach from the starting point to the end point. start and end represent the starting and ending points, respectively.

The function p1 first checks if the height is less than or equal to 0. If it is, it returns an empty list of steps. This means that the function will not attempt to find any steps if the height is 0 or less.

If the height is greater than 0, the function uses a helper function helper to determine the steps. The helper function is defined as ({1, 2, 3} - {start} - {end}).pop(). This means that the function will choose a random number from the set of numbers {1, 2, 3} that is not equal to start or end.

Once the helper function is determined, the function calls itself recursively with the height reduced by 1, start and helper as the starting and ending points, respectively. This is done by calling p1(height - 1, start, helper). The function then appends the step (start, end) to the list of steps and calls itself again with the height reduced by 1, helper and end as the starting and ending points, respectively. This is done by calling p1(height - 1, helper, end).

Finally, the function returns the list of steps. The program intends to find the shortest path between two points using the Dijkstra's algorithm. The program uses the function p1 to find the shortest path and the helper function to determine the steps.