diff --git a/math-grads.cabal b/math-grads.cabal
--- a/math-grads.cabal
+++ b/math-grads.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.10
 name: math-grads
-version: 0.1.6.2
+version: 0.1.6.4
 license: BSD3
 license-file: LICENSE
 copyright: 2017 Alexandr Sadovnikov
diff --git a/src/Math/Grads/Algo/SSSR.hs b/src/Math/Grads/Algo/SSSR.hs
--- a/src/Math/Grads/Algo/SSSR.hs
+++ b/src/Math/Grads/Algo/SSSR.hs
@@ -5,22 +5,23 @@
   ( findSSSR
   ) where
 
-import           Prelude                 hiding (map)
-
-import           Control.Arrow           ((***))
-import           Control.Lens            (over, _1, _2)
-import           Data.Bimap              ((!>))
-import           Data.List               (intersect, nub, sort)
-import           Data.List.Index         (ifoldl)
-import           Data.Map.Strict         (Map)
-import qualified Data.Map.Strict         as M (empty, insert, member, (!))
-import           Data.Matrix             (Matrix, matrix, unsafeGet, unsafeSet)
-import qualified Data.Set                as S
+import           Prelude                    hiding (map)
 
-import           Math.Grads.Algo.Cycles  (getCyclic)
-import           Math.Grads.GenericGraph (GenericGraph, subgraphWithReindex)
-import           Math.Grads.Graph        (EdgeList, toList)
+import           Control.Arrow              ((***))
+import           Control.Lens               (over, _1, _2)
+import           Data.Bimap                 ((!>))
+import           Data.List                  (intersect, nub, sort)
+import           Data.List.Index            (ifoldl)
+import           Data.Map.Strict            (Map)
+import qualified Data.Map.Strict            as M (empty, insert, member, (!))
+import           Data.Matrix                (Matrix, matrix, unsafeGet,
+                                             unsafeSet)
+import qualified Data.Set                   as S
 
+import           Math.Grads.Algo.Cycles     (getCyclic)
+import           Math.Grads.Algo.Traversals (getComps)
+import           Math.Grads.GenericGraph    (GenericGraph, subgraphWithReindex)
+import           Math.Grads.Graph           (EdgeList, toList)
 
 -- | RP-Path algorithm for searching the smallest set of smallest rings.
 -- <https://www.ncbi.nlm.nih.gov/pubmed/19805142>
@@ -31,7 +32,7 @@
     (reindex, cyclicGraph) = subgraphWithReindex graph . S.toList $ getCyclic graph
     g@(_, edges)           = toList cyclicGraph
     (n, m)                 = (length *** length) g
-    maxSSSRs               = m - n + 1
+    maxSSSRs               = m - n + length (getComps cyclicGraph)
 
     edgeIndex :: Map (Int, Int) Int
     edgeIndex = ifoldl insertEdge M.empty edges
diff --git a/src/Math/Grads/GenericGraph.hs b/src/Math/Grads/GenericGraph.hs
--- a/src/Math/Grads/GenericGraph.hs
+++ b/src/Math/Grads/GenericGraph.hs
@@ -114,6 +114,11 @@
 instance Functor (GenericGraph v) where
   fmap f (GenericGraph idxArr revMap adjArr) = GenericGraph idxArr revMap (((f <$>) <$>) <$> adjArr)
 
+instance Ord v => Semigroup (GenericGraph v e) where
+  (<>) = sumGraphs
+
+instance (Ord v, Eq v) => Monoid (GenericGraph v e) where
+  mempty = fromList ([], [])
 
 -- | 'fmap' which acts on adjacency lists of each vertex.
 --
