def from_triples(cls, triples):
        """
        Decode triples, as from :meth:`to_triples`, into an Eds object.
        """
        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)