JavaScript (Node.js), 8077 bytes
f=(x,a)=>x.flatMap(b=>a!=b&x.includes(b.slice(!a,a?a&&-1:1/0))?a?[[a,b]]:f(x,b):[])
-3B from Arnauld
JavaScript (Node.js), 80 bytes
f=(x,a)=>x.flatMap(b=>a!=b&x.includes(b.slice(!a,a?-1:1/0))?a?[[a,b]]:f(x,b):[])
JavaScript (Node.js), 77 bytes
f=(x,a)=>x.flatMap(b=>a!=b&x.includes(b.slice(!a,a&&-1))?a?[[a,b]]:f(x,b):[])
-3B from Arnauld
JavaScript (Node.js), 9580 bytes
x=>x.flatMapf=(a=>xx,a)=>x.flatMap(b=>a!=b&x.includes(a.slice(1))&x.includes(b.slice(0!a,a?-1:1/0))?a?[[a,b]]:[]f(x,b):[])
JavaScript (Node.js), 95 bytes
x=>x.flatMap(a=>x.flatMap(b=>a!=b&x.includes(a.slice(1))&x.includes(b.slice(0,-1))?[[a,b]]:[]))
JavaScript (Node.js), 80 bytes
f=(x,a)=>x.flatMap(b=>a!=b&x.includes(b.slice(!a,a?-1:1/0))?a?[[a,b]]:f(x,b):[])
JavaScript (Node.js), 95 bytes
x=>x.flatMap(a=>x.flatMap(b=>a!=b&x.includes(a.slice(1))&x.includes(b.slice(0,-1))?[[a,b]]:[]))