public HashSet<Node> findArticPoints(Node argNode, int depth,Node fromNode){
		// #Gross
		HashSet<Node> artPoints = new HashSet<Node>();
		// not sure if i should be doing this
		for(Node n:nodes){
			n.setVisited(false);
		}
		
		Stack<StackNode> stack = new Stack<StackNode>();
		stack.push(new StackNode(argNode, depth, new StackNode(fromNode, 0, null)));
		while(!stack.isEmpty()){
			StackNode sn = stack.peek();
			Node node = sn.node;
			if(sn.children == null){
				node.setVisited(true);
				node.depth = sn.depth;
				sn.reach = sn.depth;
				sn.children = new ArrayDeque<Node>();
				// for each neighbor in node
				for(Node neigh:node.getUndirectedNeighbours()){
					// FIXME this could be affected by my choice of root?
					if(!neigh.equals(sn.parent.node)){
						
						sn.children.offer(neigh);
					}
				}
			}
			else if(!sn.children.isEmpty()){
				Node child = sn.children.poll();
				// FIXME when is this every true!
				if(child.isVisited()){
					sn.reach = Math.min(sn.reach, child.depth);	
				}
				else {
					stack.push(new StackNode(child,node.depth+1,sn));
				}
			}
			else {
				if(node.depth > 1){
					if(sn.reach > sn.parent.depth){
						artPoints.add(sn.parent.node);
					}
					sn.parent.reach = Math.min(sn.parent.reach, sn.reach);
				}
				stack.pop();
			}
		}
		return artPoints;
	}