What is the proper way to relate many to many?
If the model is stable and there are always just these three references from shipment to personal_data, plain columns with FK constraints are the right and most efficient way to do it. Something like:

CREATE TABLE shipment (
  shipment_id serial PRIMARY KEY
, shipper_id  int NOT NULL REFERENCES personal_data
, receiver_id int NOT NULL REFERENCES personal_data
, notify_id   int NOT NULL REFERENCES personal_data
, ... -- more columns
);


NOT NULL may or may not fit your requirements.

Related:


How to implement a many-to-many relationship in PostgreSQL?


A junction table like you considered in closing could make sense for a varying number of references and/or references of dynamic nature (some types of references may be added / removed dynamically). More flexible, but takes up more storage and leads to more complicated queries.