```ts
export function stampTable(dies: [string, number][]): Map<string, number> {
    const table = new Map<string, number>();
    for (const [fragment, price] of dies) {
        if (!fragment || typeof fragment !== 'string' || !Number.isInteger(price) || price <= 0) {
            throw new Error('Invalid die entry');
        }
        if (table.has(fragment)) {
            throw new Error(`Fragment '${fragment}' listed twice`);
        }
        table.set(fragment, price);
    }
    return table;
}

export function stampCover(label: string, dies: [string, number][]): number {
    const table = stampTable(dies);

    let minCost = Infinity;

    for (let i = 0; i < label.length; i++) {
        const fragment = label[i];
        if (!table.has(fragment)) {
            throw new Error(`Label contains a fragment not in the dies`);
        }
        let cost = table.get(fragment)!;
        let currentCost = cost;

        for (let j = i + 1; j < label.length; j++) {
            const nextFragment = label[j];
            if (!table.has(nextFragment)) {
                throw new Error(`Label contains a fragment not in the dies`);
            }
            const nextCost = table.get(nextFragment)!;
            currentCost += nextCost;
        }

        minCost = Math.min(minCost, currentCost);
    }

    return minCost === Infinity ? -1 : minCost;
}
```