Training accuracy is ~97% but validation accuracy is stuck at ~40%. What does it imply?
A little more context about the data set and type of model would help, but most likely your model is overfitting to the training data. This means that your model is picking up noise from the training data and has basically "memorized" the data it has seen. 

Therefore, the model is not generalizable, and this results in relatively poor performance on a data set it hasn't seen, explaining the 40% validation accuracy.