Faits: A. Par acte notarié du 26 août 1997, X._ SA a vendu à A._ et à ses deux enfants B._ et C._, par parts égales, plusieurs unités d'étage sises dans un immeuble encore en construction, pour le prix de 1'680'000 fr. Les acheteurs ont pris possession des immeubles le 1er décembre 1998. Le 24 janvier 2001, la venderesse a invité les acheteurs à payer le solde du prix de vente de 50'000 fr.; ceux-ci s'y sont refusés tant que certains travaux de finition n'étaient pas exécutés. B. Le 18 février 2004, la venderesse a ouvert action contre les acheteurs en paiement solidaire de 50'000 fr. Statuant en unique instance cantonale par jugement du 25 mai 2009, la IIe Cour civile du Tribunal cantonal valaisan a rejeté la demande; en résumé, elle a retenu que la créance en paiement du solde du prix était éteinte par compensation avec la créance des acheteurs en diminution du prix découlant de divers défauts des immeubles. C. La venderesse (la recourante) interjette un recours en matière civile au Tribunal fédéral, concluant principalement à ce que les acheteurs soient condamnés solidairement à lui payer la somme de 50'000 fr. avec intérêt à 5 % l'an dès le 1er décembre 1998, sous suite de frais et dépens. Les acheteurs (les intimés) proposent le rejet du recours dans la mesure de sa recevabilité, avec suite de frais et dépens.