```ts
export function orderShelfMarks(marks: string[]): string[] {
  if (!Array.isArray(marks) || marks.length === 0) {
    throw new Error("Invalid input");
  }

  const regex = /^(?<stack>[A-Z]{1,3})\s(?<run>\d+(\.\d{1,4})?)\s(?<cutter>[a-z]\d{1,3})$/;

  const isValidMark = (mark: string): boolean => {
    return regex.test(mark);
  };

  if (!marks.every(isValidMark)) {
    throw new Error("Invalid input");
  }

  const parsedMarks = marks.map((mark) => {
    const match = mark.match(regex);
    if (!match) {
      throw new Error("Invalid input");
    }
    return {
      stack: match.groups!.stack,
      run: parseFloat(match.groups!.run),
      cutter: match.groups!.cutter,
    };
  });

  parsedMarks.sort((a, b) => {
    if (a.stack !== b.stack) {
      return a.stack.localeCompare(b.stack);
    }
    if (a.run !== b.run) {
      return a.run - b.run;
    }
    if (a.cutter[0] !== b.cutter[0]) {
      return a.cutter[0].localeCompare(b.cutter[0]);
    }
    return parseInt(a.cutter.slice(1), 10) - parseInt(b.cutter.slice(1), 10);
  });

  return parsedMarks.map((mark) => `${mark.stack} ${mark.run} ${mark.cutter}`);
}
```