private int oneMoreIdea(Integer[][] graph, Integer node, boolean looped) {
		
		Integer[] adjacentNodes = graph[node-1];
		int count = 0;
		boolean loop = looped; 
		
		if(node.intValue() == this.N.intValue()) {
			if(loop) {
				return INFINITE_LOOP; //INFINITE LOOP
			} else {
				count = 1;
			}
		} else {
			if(adjacentNodes != null) {
				
				if(this.nodeCount[node-1] == -1) {
					
					Map<Integer, Integer> adjacentNodesMap = new HashMap<Integer, Integer>();

					for(int i=0;i<adjacentNodes.length;i++) {
						Integer curNode = adjacentNodes[i];
						Integer curCount = adjacentNodesMap.get(curNode);
						if(curCount != null) {
							adjacentNodesMap.put(curNode, ++curCount);
						} else {
							adjacentNodesMap.put(curNode, 1);
						}
					}
					
					Set<Entry<Integer,Integer>> set = adjacentNodesMap.entrySet();
					Iterator<Entry<Integer,Integer>> it = set.iterator();
					
					while(it.hasNext()) {
						
						Entry<Integer, Integer> cur = it.next();
						
						if(cur.getKey() < node) {
							loop = true;
							continue;
						}
						
						int curCount = oneMoreIdea(graph, cur.getKey(), loop);
						
						if(curCount != INFINITE_LOOP) {
							count += curCount * cur.getValue();
						} else {
							return curCount;
						}
						
					}
					
					this.nodeCount[node-1] = count;
				} else {
					count = this.nodeCount[node-1];
				}
			}
		}
		
		return count;
	}