Starting at state (u, ), you have two choices:
Take edge u→v at full cost: move to state (v, ).
Use coupon on edge u→v: move to state (v, ) at half cost. Starting at state (u, ), you have one choice:
Take edge u→v at full cost: move to state (v, ).
This gives you nodes and up to edges in the state graph. Run standard Dijkstra on this expanded graph. The answer is min(dist[(N,0)], dist[(N,1)]).