in R, how to separate start, middle, and of end of string when length of string is variable?

Solution for in R, how to separate start, middle, and of end of string when length of string is variable?
is Given Below:

For example I have this,

Full Name
1 Fred Peters 
2 Fred Lukas Peters
3 Fred Lukas James Peters
4 Fred Lukas of James Peters

But want to have,

First     Middle          Last
1 Fred                      Peters
2 Fred      Lukas           Peters
3 Fred      Lukas James     Peters
4 Fred      Lukas of James  Peters
5 Michael                   Smith

I know how to separate a string into multiple columns using
separate(Full Name, c("First","Middle","Last"), " ")

but am confused on how to tell R that the last word of the string should always be in the last column, and everything between First and Last should be between.

We could use extract

library(dplyr)
library(stringr)
library(tidyr)
df1 %>%
    mutate(`Full Name` = str_replace(`Full Name`, 
     '^(\w+)\s+(\w+)$', "\1 NA \2")) %>%
     extract(`Full Name`, into = c("First","Middle","Last"), 
          "^(\S+)\s+(.*)?\s+(\S+)$", convert = TRUE)

-output

   First         Middle   Last
1  Fred             NA Peters
2  Fred          Lukas Peters
3  Fred    Lukas James Peters
4  Fred Lukas of James Peters

data

df1 <- structure(list(`Full Name` = c("Fred Peters", "Fred Lukas Peters", 
"Fred Lukas James Peters", "Fred Lukas of James Peters")), 
class = "data.frame", row.names = c("1", 
"2", "3", "4"))