Here's the details of finding Euler path using Hierholzer’s Algorithm. I implemented it in Java.
The main steps are as follows.

Start with an empty stack and an empty circuit (eulerian path).
 If all vertices have same outdegrees as indegrees  choose any of them.
 If all but 2 vertices have same outdegree as indegree, and one of those 2 vertices has outdegree with one greater than its indegree, and the other has indegree with one greater than its outdegree  then choose the vertex that has its outdegree with one greater than its indegree.
 Otherwise no euler circuit or path exists.

If current vertex has no outgoing edges (i.e. neighbors)  add it to circuit, remove the last vertex from the stack and set it as the current one. Otherwise (in case it has outgoing edges, i.e. neighbors)  add the vertex to the stack, take any of its neighbors, remove the edge between that vertex and selected neighbor, and set that neighbor as the current vertex.

Repeat step 2 until the current vertex has no more outgoing edges (neighbors) and the stack is empty.
Note that obtained circuit will be in reverse order  from end vertex to start vertex.
Code:
public class Solution {
public List<String> findItinerary(String[][] tickets) {
Map<String, PriorityQueue<String>> map = new HashMap<>();
LinkedList<String> route = new LinkedList<>();
Stack<String> stack = new Stack<>();
for (String[] t : tickets) {
map.putIfAbsent(t[0], new PriorityQueue<>());
map.putIfAbsent(t[1], new PriorityQueue<>()); //construct a queue for every node (even those without neighbors)
map.get(t[0]).add(t[1]);
}
String cur = "JFK";
while (map.get(cur).size() != 0  !stack.isEmpty()){
if (map.get(cur).size() == 0){
route.add(cur);
cur = stack.pop();
} else {
stack.add(cur);
cur = map.get(cur).poll();
}
}
route.add(cur);
Collections.reverse(route);
return route;
}
}