reworked toString()