completed toString()