Anche se come si dice in gergo "funziona" non vuol dire che sia corretto.
La memoria va allocata !
codice:
char *word[ELEM][ELEM];
Qui hai una matrice di puntatori.
Ma sono tutti puntatori che contengono solo un indirizzo,non ci hai allocato memoria.
Con questa matrice potresti prendere su (allocando spazio) ELEM x ELEM stringhe:
codice:
for(i=0;i<ELEM;i++)
    for(j=0;j<ELEM;j++)
    {
        word[i][j]=(char*)calloc(100,sizeof(char));
        fgets(word[i][j],100,stdin);
    }
for(i=0;i<ELEM;i++)
    for(j=0;j<ELEM;j++)
        puts(word[i][j]);
Oppure sostiusuisci la riga con:
codice:
char word[ELEM][ELEM];
E prendi su le righe con scanf anche se te lo sconsiglio,meglio usare fgets.