public String toString()
	{
		int totalOutdegree = 0;
		int totalIndegree = 0;
		int totalNodes = 0;
		int maxIndegree = 0;
		int maxOutdegree = 0;
		StringBuilder sb = new StringBuilder();
		HashSet<Node> printed = new HashSet<Node>();
		try
		{
			SimpleQueue<Node> queue = new SimpleQueue<Node>();
			queue.add( start );
			while ( !queue.isEmpty() )
			{
				Node node = queue.poll();
				if ( node.indegree() > maxIndegree )
					maxIndegree = node.indegree();
				if ( node.outdegree() > maxOutdegree )
					maxOutdegree = node.outdegree();
				totalIndegree += node.indegree();
				totalOutdegree += node.outdegree();
				totalNodes++;
				node.verify();
				ListIterator<Arc> iter = node.outgoingArcs(this);
				while ( iter.hasNext() )
				{
					Arc a = iter.next();
					sb.append( a.toString() );
					sb.append( "\n" );
					a.to.printArc( a );
					printed.add( a.to );
					if ( a.to != end && a.to.allPrintedIncoming(constraint) )
					{
						queue.add( a.to );
					}
				}
			}
			Iterator<Node> iter2 = printed.iterator();
			while ( iter2.hasNext() )
			{
				Node n = iter2.next();
				n.reset();
			}
		}
		catch ( Exception e )
		{
			System.out.println(sb.toString());
		}
		float averageOutdegree = (float)totalOutdegree/(float)totalNodes;
		float averageIndegree = (float)totalIndegree/(float)totalNodes;
		sb.append("\naverageOutdegree=" );
		sb.append( averageOutdegree );
		sb.append("\naverageIndegree=" );
		sb.append( averageIndegree );
		sb.append("\nmaxOutdegree=" );
		sb.append( maxOutdegree );
		sb.append("\nmaxIndegree=" );
		sb.append( maxIndegree );
		return sb.toString(); 
	}