There's no way to do that with sparql property paths: you just find out whether there is a path, not what the path is.
You could try:
o:a t:p{*} ?middle .
?middle t:p{*} o:o .
but I'm not convinced that will work.
Edit: ok, that does work (I thought * would be greedy), although you won't get the properties. I use !ex:nothing* to indicated 'any property' (there must be a better way):
prefix ex: <http://invalid.org/>
select * {
o:a !ex:nothing* ?middle .
?middle !ex:nothing* o:o
}