Tournament Scheduling Problem
The chronological order constraint actually makes this problem much easier to solve than D.W. thought. It means that we can orient edges in the graph from earlier to later tournaments (reflecting the fact that we cannot travel back in time), and wind up with a DAG (cycle-free directed graph). The problem can be solved optimally in $O(pn^2)$ time and $O(pn)$ space (so, at most a few milliseconds and KB for your problem size) using dynamic programming.
Let $f(v, i)$ be the length of the shortest $i$-vertex path that ends at vertex $v$. The goal is to compute $f(v, p)$ across all vertices, and pick the $v$ that minimises the function among all of them.
The shortest $i$-vertex path ending at vertex $v$ must be the result of extending (by one edge, to $v$) the shortest length-$(i-1)$ path to one of $v$'s predecessors:
$f(v, i) = \min_{u:uv\in E} f(u,i-1)+d_{uv}$
where $E$ is the set of all edges in the graph and $d_{uv}$ is the distance between $u$ and $v$.
Naturally we also have $f(v, 1) = 0$ for all $v$. So, we can compute all these function values and store them in a 2D array as follows:

Initialise $f[1][v] = 0$ for all $v$.
For $i$ from 2 to $p$:

For each $v$ in $V$:

Set $x = \infty$.
For each predecessor (in-neighbour) $u$ of $v$:

Set $x = \min(x, f[i-1][u] + d_{uv})$.


Set $f[i][v] = x$.




Set $z=v_1$.
For each $v$ in $V\setminus \{v_1\}$:

If $f[p][v] &lt; f[p][z]$ then set $z=v$.



After running this, we know the lengths of all shortest paths of $i$ vertices or less ending at each vertex, and that the shortest overall path of $p$ vertices ends at vertex $z$. To find an actual shortest path ending at vertex $z$, we can trace backwards through the matrix looking for predecessor entries that satisfied the $\min$ condition:

Set $i=p$.
While $i&gt;0$:

Output the current vertex, $z$.
Set $x = \infty$.
For each predecessor (in-neighbour) $u$ of $z$:

If $f[i-1][u] + d_{uz} = f[i][z]$:

$u$ is the previous tournament on some optimal path ending at $z$, so set $z=u$, decrease $i$ by 1 and jump to the top of the while loop.







This will output the tournaments in reverse order, but that can be easily fixed.