There is one reason to have a numeric (surrogate) key on a many-to-many join table... That is, when there are other child derived tables that would need Foreign Keys back to the records in this table... i.e., say you have Table PetStores w/StoreId, table Breeds w/BreedId, and many-to-many join table StoreBreeds that has a row for each store=breed combination... And then let's say you want to track the price, and Store Discount for each breed at each stoer, as it has changed over time, So you need another table to record the price of each breed at each store, with valid start and end dates reflecting the range of dates when the price was in effect for that breed at that store..
if you only haD a meaningful composite key for the many to many join table, then the FK in the child table would have to be composite as well, based on StoreId and BreedId... For performance, adding a non-meaningful integral surrogate key to the join table allows you to use that as the FK in derived child tables instead, and thereby increase the performance of joins to retrieve those child records...
In a simple case, this may not be that significant, but in more complex scenarios, where the composite key consists of 4 or more columns, the impact can be substantial.