public void pulse(int PTime, int PDist, ArrayList<Integer> path) 
	{
		// if a node is visited for first time, sort the arcs
		if (this.firstTime) {
			this.firstTime = false;
			this.Sort(this.magicIndex);
			leftDist = null;
			rigthDist = null;
			reverseEdges = null;
		}
		
		// Label update
		changeLabels(PTime, PDist);
		// Check for cycles
		if (PulseGraph.Visited[id]==0) {
			// Add the node to the path
			path.add(id);
			// Update the visit indicator
			PulseGraph.Visited[id]=1;
			// Pulse all the head nodes for the outgoing arcs
			for (int i = 0; i < magicIndex.size(); i++) {
				// Update distance and time
				int NewTime = 0;
				int NewDist = 0;
				NewTime = (PTime + DataHandler.Time[magicIndex.get(i)]);
				NewDist = (PDist + DataHandler.Distance[magicIndex.get(i)]);
				// Pruning strategies: infeasibility, bounds and labels
				if (NewTime <= (PulseGraph.TimeC - PulseGraph.vertexes[DataHandler.Arcs[magicIndex.get(i)][1]].getMinTime()) &&
					NewDist <= (PulseGraph.PrimalBound - PulseGraph.vertexes[DataHandler.Arcs[magicIndex.get(i)][1]].getMinDist()) && 
					!PulseGraph.vertexes[DataHandler.Arcs[magicIndex.get(i)][1]].CheckLabels(NewTime, NewDist)){
					// If not pruned the pulse travels to the next head node
					PulseGraph.vertexes[DataHandler.Arcs[magicIndex.get(i)][1]].pulse(NewTime, NewDist, path);
				}
			}
			// Updates path and visit indicator for backtrack
			path.remove((path.size() - 1));
			PulseGraph.Visited[id]=0;
		}
	}