diff --git a/Data/Graph/Wrapper.hs b/Data/Graph/Wrapper.hs
--- a/Data/Graph/Wrapper.hs
+++ b/Data/Graph/Wrapper.hs
@@ -15,6 +15,7 @@
     vertex,
     
     fromListSimple, fromList, fromListBy, fromVerticesEdges,
+    toList,
     
     vertices, edges, successors,
     
@@ -29,6 +30,8 @@
     SCC(..), stronglyConnectedComponents, sccGraph
   ) where
 
+import Data.Graph.Wrapper.Internal
+
 import Control.Arrow (second)
 import Control.Monad
 import Control.Monad.ST
@@ -69,13 +72,6 @@
 -- | An edge from the first vertex to the second
 type Edge i = (i, i)
 
--- | A directed graph
-data Graph i v = G {
-    graph :: G.Graph,
-    indexGVertexArray :: Array G.Vertex i,
-    gVertexVertexArray :: Array G.Vertex v
-  }
-
 instance (Ord i, Show i, Show v) => Show (Graph i v) where
     show g = "fromVerticesEdges " ++ show ([(i, vertex g i) | i <- vertices g]) ++ " " ++ show (edges g)
 
@@ -157,6 +153,13 @@
                            EQ -> mid
                            GT -> go (mid + 1) b
      where mid = (a + b) `div` 2
+
+
+-- | Morally, the inverse of 'fromList'. The order of the elements in the output list is unspecified, as is the order of the edges
+-- in each node's adjacency list. For this reason, @toList . fromList@ is not necessarily the identity function.
+toList :: Ord i => Graph i v -> [(i, v, [i])]
+toList g = [(indexGVertexArray g ! m, gVertexVertexArray g ! m, map (indexGVertexArray g !) ns) | (m, ns) <- assocs (graph g)]
+
 
 -- | Exhaustive list of vertices in the graph
 vertices :: Graph i v -> [i]
diff --git a/Data/Graph/Wrapper/Internal.hs b/Data/Graph/Wrapper/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Data/Graph/Wrapper/Internal.hs
@@ -0,0 +1,19 @@
+-- | Exposes things that are considered to be too unstable for inclusion in the exports of "Data.Graph.Wrapper".
+--
+-- Use of this module should be avoided as it will change frequently and changes to this module alone will not necessarily
+-- follow the Package Versioning Policy.
+{-# OPTIONS_HADDOCK not-home #-}
+module Data.Graph.Wrapper.Internal (
+    Graph(..)
+  ) where
+
+import Data.Array
+import qualified Data.Graph as G
+
+-- | A directed graph
+data Graph i v = G {
+    graph :: G.Graph,
+    indexGVertexArray :: Array G.Vertex i,
+    gVertexVertexArray :: Array G.Vertex v
+  }
+
diff --git a/graph-wrapper.cabal b/graph-wrapper.cabal
--- a/graph-wrapper.cabal
+++ b/graph-wrapper.cabal
@@ -1,17 +1,18 @@
 Cabal-Version:      >= 1.2
 Build-Type:         Simple
 Name:               graph-wrapper
-Version:            0.2.1
+Version:            0.2.2
 Maintainer:         Max Bolingbroke <batterseapower@hotmail.com>
 Homepage:           http://www.github.com/batterseapower/graph-wrapper
 License:            BSD3
 License-File:       LICENSE
 Author:             Max Bolingbroke
 Synopsis:           A wrapper around the standard Data.Graph with a less awkward interface
-Category:           Data Structures
+Category:           Data Structures, Graphs
 
 Library
     Exposed-Modules:    Data.Graph.Wrapper
+                        Data.Graph.Wrapper.Internal
     
     Build-Depends:      base >= 3.0 && < 5.0,
                         array >= 0.3 && < 0.4,
