code: def from_triples(cls, triples):
          
          nids, nd, edges = [], {}, []
          for src, rel, tgt in triples:
              if src not in nd:
                  nids.append(src)
                  nd[src] = {'pred': None, 'lnk': None, 'carg': None, 'si': []}
              if rel == 'predicate':
                  nd[src]['pred'] = Pred.surface_or_abstract(tgt)
              elif rel == 'lnk':
                  cfrom, cto = tgt.strip('"<>').split(':')
                  nd[src]['lnk'] = Lnk.charspan(int(cfrom), int(cto))
              elif rel == 'carg':
                  if (tgt[0], tgt[-1]) == ('"', '"'):
                      tgt = tgt[1:-1]
                  nd[src]['carg'] = tgt
              elif rel == 'type':
                  nd[src]['si'].append((CVARSORT, tgt))
              elif rel.islower():
                  nd[src]['si'].append((rel, tgt))
              else:
                  edges.append((src, rel, tgt))
          nodes = [
              Node(
                  nodeid=nid,
                  pred=nd[nid]['pred'],
                  sortinfo=nd[nid]['si'],
                  lnk=nd[nid]['lnk'],
                  carg=nd[nid]['carg']
              ) for nid in nids
          ]
          top = nids[0] if nids else None
          return cls(top=top, nodes=nodes, edges=edges)
docs: Decode triples, as from :meth:`to_triples`, into an Eds object.