Se você estiver agrupando por uma (ou mais) coluna, precisará fazer algo em todas as colunas não agrupadas para que sua consulta faça sentido.
Você tem que dizer o que quer que seja feito com todos os valores agrupados. Normalmente algo como SUM(), AVG(), MIN(), MAX(), GROUP_CONCAT()
Se você estiver agrupando por m_from, não poderá classificar por m_time, pois todos os registros de m_from serão agrupados e, para os valores não agrupados, você obterá uma resposta arbitrária, pois não especificar o que fazer com o grupo.
Você provavelmente deseja usar uma função de agregação, como MAX(m_time) para obter o valor mais alto para m_time e, em seguida, classificá-lo.
Eu sugeriria algo como.
SELECT MAX(m_id),m_from, MAX(m_time) as latest FROM messages
WHERE m_to='XXX' OR m_from='XXX'
GROUP BY m_from
ORDER BY latest DESC;