# [Jelly], <s>&nbsp;27 25&nbsp;</s> 24 [bytes]

-1 thanks to Erik the Outgolfer (use a zero instead of a space character)

    Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K

A full program accepting an argument in the form of a Python formatted list of lists of strings which prints the output to STDOUTt.

**[Try it online!][TIO-jvl018kb]**

### How?

    Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K - Main Link: list of lists of lists of characters
     € ¦                     - sparse application...
      2                      - ...to indices: [2]
    Ż                        - ...action: prepend a zero (place holder for no adjective)
        Œp                   - Cartesian product (all choices, including invalid ones)
           €                 - for each:
          ḟ 0                -   filter out any zeros
                   Ƈ         - filter keep those for which:
                  Ʋ          -   last four links as a monad:
             Z               -     transpose
              Ḣ              -     head
               Œu            -     upper-case
                 E           -     all equal?
                    X        - random (uniform) choice  e.g. [['B','o','b'],['b','l','u','e'],['b','a','g']]
                     ż       - zip with:
                      “'s“”  -   list [["'", 's'], []]       [[['B','o','b'],["'", 's']],[['b','l','u','e'],[]],['b','a','g']]
                           K - join with spaces              [['B','o','b'],["'", 's'],' ',['b','l','u','e'],[],' ','b','a','g']
                             - implicit (smashing) print     Bob's blue bag


[Jelly]: https://github.com/DennisMitchell/jelly
[bytes]: https://github.com/DennisMitchell/jelly/wiki/Code-page
[TIO-jvl018kb]: https://tio.run/##y0rNyan8///o7kdNa4wOLTs6qeDhjvlAtkHUwx2Ljk4qdT226Vh7xNE9jxrmqBcDiUcNc73///8fHa3ul5qZo66joO6XmZyfkwhi@ReXJ@akgFjBGalFuYl5YGZJakFGYl5mqnqsDpdCtHpeajlIOC@/LBWsPR@iI78oMz0zLxEsVJyanJ8HFi3OzEnNK4HpzC/NQ9VaWlJQWoKmIyM1tQDMyEvMBtoZCwA "Jelly – Try It Online"